注:本文主要思想来自《HeadFirst 设计模式》
定义:动态地将责任附加到对象上,若要扩展对象,装饰者模式提供了比继承更弹性的替代方案
->遵循开放-关闭原则(对拓展开放,对修改关闭 即不能修改原先的代码进行拓展)
我这里举咸蛋超人的例子说明:
怪物降临,咸蛋超人从天而降。然而此时的咸蛋超人是刚进新手村的,所以战斗力只有5
public interface Superman {
String Weapon(); //武器
int FightCapacity();//战斗力
}
咸蛋超人类,继承了Superman接口
public class Ultraman implements Superman{
String weapon = "裤衩"; //刚进新手村,身上只有一件绑定衣服(裤衩)
int fight = 5; //战斗力只有五的
public String Weapon(){
return weapon;
}
public int FightCapacity(){
return fight;
}
}
在主类中运行
public class Test {
public static void main(String[] args) {
Superman man = new Ultraman();
man = new Stealth(man);
man = new LaserGun(man);
System.out.println("现在装备有:"+man.Weapon());
System.out.println("现在战斗力有:"+man.FightCapacity());
}
}
输出为:
现在装备有:裤衩
现在战斗力有:5
于是乎。。。超人刚登场就被怪兽打跑了,但在科学家的思考下决定给超人装备武器,这就是我们的装饰者
科学家在考虑了超人本身是不能拆之后,决定为他添加武器隐形衣和镭射枪
他们定制了一个武器入口,专门用于为超人穿戴武器 这就是 抽象装饰者
public abstract class WeaponDecorator implements Superman{ //定义武器类抽象装饰者
//定义武器装饰方法
public abstract String Weapon();
//定义装备了武器后的增加战斗力方法
public abstract int FightCapacity();
}
有了这个穿戴武器的接口我们就可以穿戴强大的武器(
具体装饰者)
具体装饰者 隐形衣类
public class Stealth extends WeaponDecorator{ //武器->隐形衣
Superman superman;
String weapon = "隐形衣"; //这是件隐形衣
int fight = 100; //隐形+100
public Stealth(Superman superman){
this.superman = superman;
}
public String Weapon(){
return weapon+","+superman.Weapon();
}
public int FightCapacity(){
return fight+superman.FightCapacity();
}
}
具体装饰者 镭射枪类
public class LaserGun extends WeaponDecorator{ //武器->镭射枪
Superman superman;
String weapon = "镭射枪"; //这是把镭射枪
int fight = 50; //隐形+100
public LaserGun(Superman superman){
this.superman = superman;
}
public String Weapon(){
return weapon+","+superman.Weapon();
}
public int FightCapacity(){
return fight+superman.FightCapacity();
}
}
科学家总于把全部武器生产好了,我们可以为超人装备武器了,在主类中
public class Test {
public static void main(String[] args) {
Superman man = new Ultraman();
man = new Stealth(man);
man = new LaserGun(man);
System.out.println("现在装备有:"+man.Weapon());
System.out.println("现在战斗力有:"+man.FightCapacity());
}
}
输出为:
现在装备有:镭射枪,隐形衣,裤衩
现在战斗力有:155
在科学家的帮忙下,咸蛋超人战斗力剧增,很快就帮怪兽消灭了,地球再次得到了和平-------》》》》》》》》》》》》》》》》》》》》
体会:开放-关闭原则 充分体现了组合-委托的优势,摆脱过度依赖继承,增加程序的弹性