Java学习笔记

JAVA学习笔记之 装饰设计模式

2016-12-02  本文已影响13人  红姑娘

装饰设计模式

就是对类本身的功能进行了增强。
其实我们曾经还学过一个东西,也可以对类的功能进行增强。

继承。

对手机进行功能的扩展。

继承:

定义一个基本的手机类:
Phone.java
我喜欢在接电话之前,听会铃声。
请问怎么实现。
重写定义一个手机类,继承以前的手机。只不过扩展了听彩铃的功能。
MusicPhone.java
随着需求的发展,我的要求又改变了,我喜欢的手机是在打完电话后,可以听广告的。
AdPhone.java
我的要求又提高了,我想在打电话前听彩铃,打电话后听广告。
a:继承Phone类,自己在打电话前提供听彩铃功能,打电话后听广告功能。
b:继承MusicPhone类,只添加听广告功能。
c:继承AdPhone类,只添加听彩铃功能。
随着我的需求,越来越多,我们会发现,这个继承结构也越来越庞大。
继承结构越判断,将来的灵活性越差。

装饰设计模式的组成:

接口
对接口的具体实现
抽象装饰类
具体装饰类

实例:

定义一个接口:定义的是那个被装饰的抽象的东西
Phone.java
定义一个具体的事物类:
PhoneImpl.java
定义一个抽象的装饰类:
PhoneDecorate.java
具体的装饰类:
铃声装饰类:MusicPhoneDecorate.java
广告装饰类:AdPhoneDecorate.java
铃声和广告装饰类:错误。不用提供。

定义一个Phone接口

public interface Phone {
public abstract void call();
}

定义一个PhoneImpl具体实例

  public class PhoneImpl implements Phone {
@Override
public void call() {
    System.out.println("手机可以打电话");
}
    }

定义一个PhoneDecorate抽象的装饰类

public abstract class PhoneDecorate implements Phone {

private Phone p;

public PhoneDecorate(Phone p) { // new PhoneImp(); new PhoneImpl2();
    this.p = p;
}

@Override
public void call() {
    this.p.call();
}
}

定义一个MusicPhoneDecorate具体的装饰类

public class MusicPhoneDecorate extends PhoneDecorate {

public MusicPhoneDecorate(Phone p) {
    super(p);
}

@Override
public void call() {
    System.out.println("手机可以听彩铃");
    super.call();
}

}

定义一个AdPhoneDecorate具体的装饰类

public class AdPhoneDecorate extends PhoneDecorate {

public AdPhoneDecorate(Phone p) {
    super(p);
}

@Override
public void call() {
    super.call();
    System.out.println("手机可以听广告了");
}
 }

定义一个测试类

public class PhoneDemo {
public static void main(String[] args) {
    Phone p = new PhoneImpl();
    p.call();
    System.out.println("-------------");

    PhoneDecorate pd = new MusicPhoneDecorate(p);
    pd.call();
    System.out.println("-------------");

    pd = new AdPhoneDecorate(p);
    pd.call();
    System.out.println("-------------");

    pd = new AdPhoneDecorate(new MusicPhoneDecorate(p));
    pd.call();
    System.out.println("-------------");
    
    
    
    
    pd = new MusicPhoneDecorate(new AdPhoneDecorate(p));
    pd.call();
    System.out.println("-------------");
}
}

打印结果如下:

屏幕快照 2016-12-02 17.59.28.png
上一篇下一篇

猜你喜欢

热点阅读