装饰模式可以组合在一起使用。
参考资料:http://blog.csdn.net/janice0529/article/details/44160091
说明:作者还写了很多设计模式的文章。
《设计模式 Java 版》GitHub 书籍。
https://www.gitbook.com/book/quanke/design-pattern-java/details
手机类,是一个接口,它是抽象的。
public interface Phone {
public abstract void call();
}
手机类的基本实现类(没有额外功能)
苹果手机(基础手机类,没有添加任何的额外功能)
public class IPhone implements Phone{
@Override
public void call() {
System.out.println("苹果手机可以打电话。");
}
}
下面给手机设置额外的功能(重点,抽象,这是核心)
装饰器抽象类(这个类非常重要)
public abstract class PhoneDecorate implements Phone {
private Phone phone;
public PhoneDecorate(Phone phone){
this.phone = phone;
}
@Override
public void call() {
this.phone.call();
}
}
装饰器具体的类(通过构造器注入,然后重写父类的方法,在父类方法的前后增加逻辑)
super 这个关键字很重要,决定了是由父类对象实现。自己添加的逻辑,在这个方法的前后,而没有全部覆盖了父类方法。
super 这个关键字很重要,决定了是由父类对象实现。自己添加的逻辑,在这个方法的前后,而没有全部覆盖了父类方法。
super 这个关键字很重要,决定了是由父类对象实现。自己添加的逻辑,在这个方法的前后,而没有全部覆盖了父类方法。
1、可以听音乐的装饰器
public class MusicDecorate extends PhoneDecorate{
public MusicDecorate(Phone phone) {
super(phone);
}
@Override
public void call(){
System.out.println("装饰器:手机可以听音乐");
super.call();
}
}
2、可以看书的装饰器
public class BookDecorate extends PhoneDecorate {
public BookDecorate(Phone phone) {
super(phone);
}
@Override
public void call(){
super.call();
System.out.println("装饰器:手机可以看电子书");
}
}
测试类:
public class Test {
public static void main(String[] args) {
Phone myPhone = new BookDecorate(new MusicDecorate(new IPhone()));
myPhone.call();
}
}
JDK 中的实现类: IO。