上一章讲到小菜教会娇娇修电脑了,然后这一章就要去约会了。
那么问题来了,穿什么衣服去呢?
小菜先是简单写了一下,一个Person类,里面有wearTshirts()、wearBigTrouser()等方法,
客户端调用的时候,按不同的调用顺序可以生成不同的穿搭方式。
这时候,如果要增加一种“超人”装扮,那么就要去修改Person类,这就违反了开闭原则,继承扩展她,而不是修改她。
然后小菜又提出一种解决办法,将所有的服饰都写成子类,新增子类并不影响父类的调用。
服饰 tshirt = new TShirt();
服饰 trouser = new Trouser();
...
tshirt.show();
trouser.show();
...
这样,每个子类都要调用show方法,彷佛是在众目睽睽之下穿衣服。
小菜提出:这些步骤应该在内部组装完成,似乎是建造者模式 - build()
大鸟纠正:建造者模式要求构建的过程必须是稳定的,但此处穿衣服的内容和顺序都是不固定的。
装饰者模式 - 动态地给一个对象增加一些额外的职责,就增加子类来说,装饰模式比生成子类更为灵活
public class PersonComponent {
private String name;
public void show() {
System.out.println("hahaha");
}
}
public abstract class FineryDecorator extends PersonComponent {
protected PersonComponent personComponent;
public void setPersonComponent(PersonComponent personComponent) {
this.personComponent = personComponent;
}
public abstract void show();
}
public class TShirt extends FineryDecorator{
@Override
public void show() {
personComponent.show();
System.out.println("TShirt...");
}
}
public class BigTrouser extends FineryDecorator {
@Override
public void show() {
personComponent.show();
System.out.println("bigtrouser...");
}
}
public class Test {
public static void main(String[] args) {
PersonComponent personComponent = new PersonComponent();
FineryDecorator tShirt = new TShirt();
FineryDecorator bigTrouser = new BigTrouser();
tShirt.setPersonComponent(personComponent);
bigTrouser.setPersonComponent(tShirt);
bigTrouser.show();
}
}
https://github.com/toyranger/DesignPatterns_chengjie.git
装饰模式是为已有功能动态的添加更多功能的一种方式。
什么时候使用呢?
当系统需要新功能时,如果是向类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为,这种做法的问题在于,她们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度。
就像一开始的Person类那样,新加入的wearX()方法,仅仅是为了满足一些只有在某种特定情况下才会执行的特殊行为的需要。
而装饰模式是把每个需要装饰的功能放在单独的类中,并让这个类包装她所需要装饰的对象,因此当需要执行特殊行为时,客户端代码就可以在运行时根据需要有选择按顺序的使用装饰功能包装对象了。
装饰模式的好处,把类中的装饰功能从类中搬移出去,这样可以简化原有的类,可以有效的把类的核心职责和装饰功能区分开,而且可以去除相关类中重复的装饰逻辑。
装饰模式,简单来说,就是装饰器要装饰谁,就把谁传入自己的setComponent()中。
这一章讲的让我挺明白的。