装饰设计模式
就是对类本身的功能进行了增强。
其实我们曾经还学过一个东西,也可以对类的功能进行增强。
继承。
对手机进行功能的扩展。
继承:
定义一个基本的手机类:
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("-------------");
}
}
网友评论