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

装饰设计模式

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

继承。

对手机进行功能的扩展。

继承:

定义一个基本的手机类:
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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,552评论 25 708
  • 1 场景问题# 1.1 复杂的奖金计算## 考虑这样一个实际应用:就是如何实现灵活的奖金计算。 奖金计算是相对复杂...
    七寸知架构阅读 4,057评论 4 67
  • 一个侦探朋友向我哭诉 “你别以为我们的工作像电影那样精彩, 我们每天就是调出监控,看监控,调出监控,看监控,像坐牢...
    留子尧阅读 183评论 2 3
  • 大学毕业以后,一直混得很惨淡。换过好几份工作,都不满意。被骗过钱,也被恶人欺负过,但我从来都没有怨恨过社会。我没有...
    七彩祥云阅读 423评论 0 1
  • 音阶练习是作为日常训练非常有用的。第一,音阶强化了音符音调的概念,以及他们与指板的联系。熟悉音阶有助于视奏者预先知...
    吉他微刊阅读 4,318评论 2 1