装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了 开闭原则(ocp)。
对于手机,普通手机,智能手机,vivo,彩铃功能。如果其他类都是继承手机类的话,对于可能出现的各种组合需要一直继承下,导致类爆炸,如果又新出现一种新的功能,又要重新组合。导致很复杂,所以出现装饰者模式,对某一项简单的功能层层包装,实现复杂功能,修饰类与被修饰类需要实现同一接口或方法。
定义一个手机接口
interface phone {
public void call();
}
普通手机
public class ordinaryPhone implements phone {
public void call() {
System.out.println("普通手机可以打电话");
}
}
智能手机
public class smartPhone extends ordinaryPhone {
private phone p;
public smartPhone(phone p1) {
this.p=p1;
}
public void call() {
super.call();
System.out.println("我是智能手机还可以拍照");
}
}
vivo手机
public class vivo extends smartPhone{
public vivo(phone p1) {
super(p1);
System.out.println("我是vivo智能手机");
}
public void call() {
this.play();
super.call();
System.out.println("一边打游戏一边打电话");
}
public void play() {
System.out.println("我还可以打游戏");
}
}
手机铃声功能:
public class ring implements phone {
private phone p;
public ring(phone p1) {
this.p=p1;
}
@Override
public void call() {
p.call();
System.out.println("有彩铃功能");
}
}
测试类
public class test {
public static void main(String[] args) {
phone p=new ordinaryPhone();
p=new smartPhone(p);
//智能手机功能
p.call();
p=new vivo(p);
//做成vivo的功能
p.call();
//添加彩铃功能
p=new ring(p);
p.call();
}
}
可以对手机功能做任何扩展,直接实现phone同一个接口即可。然后传入已有Phone加强对象。也可用于功能增强。