Java 设计模式 - 装饰模式
看了大话设计模式此章节多遍才稍微有点理解,特此记录。
深入浅出,通俗易懂。
情景:
小菜要去见未来女友 娇娇,来个服装打扮的设计。
第一弹:
客户端代码:
public static void main(String[] args){
小菜 xiaocai = new 小菜();
xiaocai.穿T恤();
xiaocai.穿垮裤();
xiaocai.穿破球鞋();
xiaocai.穿西装();
//…….
}
问题来了,
娇娇喜欢超人,小菜这次想穿的是超人,咋办? 直接修改小菜的类吗? 这就违背了开闭原则。
解决办法:
把装扮的东西抽象出来,小菜需要啥衣服,就实例化对应的装扮即可。
public static void main(String[] args){
人 小菜 = new 人();
T恤 t恤 = new T恤();
垮裤 kuaku = new 垮裤();
西装 xizhuang = new 西装();
Tie tie = new Tie();
t恤.show();
kuaku.show();
xizhuang.show();
tie.show();
//…….
}
问题又来了,
整个配置过程大家伙都可以看到,并且顺序也固定了,先穿这个再穿那个;如何配置过程隐藏起来,顺序也能灵活。
解决办法:
简化版的装饰模式
// ConcreteComponent
public class Person {
private String name;
public Person(){}
public Person(String name) {
this.name = name;
}
public void show(){
System.out.println("装扮的"+name);
}
}
//Decorater
public class Finery extends Person {
protected Person component;
//打扮
public void Decorate(Person component){
this.component = component;
}
@Override
public void show() {
// TODO Auto-generated method stub
if(null != component){
component.show();
}
}
}
// ConcreteDecorator
public class Tshirts extends Finery {
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("大T恤");
super.show();
}
}
public class BigTrouser extends Finery {
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("垮裤");
super.show();
}
}
// 客户端代码
public static void main(String[] args) {
Person xc = new Person("小菜");
Tshirts dtx = new Tshirts();
BigTrouser kk = new BigTrouser();
dtx.Decorate(xc);
kk.Decorate(dtx);
kk.show();
}
总结:
装饰模式:有效地把类中的核心职责和装饰功能区分开,去除相关类中重复的装饰逻辑,简化原有的类;