装饰模式Decorator:
动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加的灵活。
比如张三想穿衣服,不知道穿什么
我们这个时候就要给他装饰,让他穿上衣服
所以:首先由个Person类
public class Person {
//姓名
private String name;
public Person(){}
public Person(String name){
this.name = name;
}
public void show(){
System.out.println(name+"到底穿什么呢???");
}
}
装饰类:继承Person类
可以是抽象类,也可以是普通类
public abstract class Decorate extends Person{
protected Person person;
public void setDecorate(Person person){
this.person = person;
}
//展示
public void show(){
person.show();
}
}
开始实现装饰:
穿T恤类
public class TShirt extends Decorate{
private String TShirtName;
public TShirt(String TShirtName){
this.TShirtName = TShirtName;
}
public void show(){
super.show();
System.out.println("穿上"+TShirtName+"牌的T恤");
}
}
穿鞋类:
public class Shoes extends Decorate {
private String shoesName;
public Shoes(String shoesName){
this.shoesName = shoesName;
}
public void show(){
super.show();
System.out.println("穿上"+shoesName+"牌的鞋");
}
}
测试类:
public class Client {
public static void main(String[] args) {
Person person = new Person("张三");
TShirt tShirt = new TShirt("森马");
Shoes shoes = new Shoes("特步");
shoes.setDecorate(tShirt);
tShirt.setDecorate(person);
shoes.show();
}
}
张三到底穿什么呢???
穿上森马牌的T恤
穿上特步牌的鞋
如果还想给张三穿上别的衣服,只需添加一个类,而不是在原有的类中进行修改,比如我在让它穿上领带。
领带类:
public class Tie extends Decorate {
public void show(){
super.show();
System.out.println("穿上领带");
}
}
客户端:
public class Client {
public static void main(String[] args) {
Person person = new Person("张三");
TShirt tShirt = new TShirt("森马");
Shoes shoes = new Shoes("特步");
Tie tie = new Tie();
shoes.setDecorate(tShirt);
tShirt.setDecorate(tie);
tie.setDecorate(person);
shoes.show();
}
}
张三到底穿什么呢???
穿上领带
穿上森马牌的T恤
穿上特步牌的鞋
所以装饰模式是为已有的功能动态的添加更多功能的一种方式,它能把每个要装饰的功能放在单独的类中,并让这个类包装她所要装饰的对象,因此当需要执行特殊的行为时,客户代码就可以在运行时根据需要有选择的,按顺序的使用装饰功能包装对象了。
总之,装饰模式的优点是,把类中的装饰功能从类中搬移去除,这样就可以简化原有的类。有效的把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑