设计模式——装饰模式
@author 无忧少年
@createTime 2019/7/19
**装饰模式:**动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
装饰器模式结构图:
这个设计模式最开始还不是很理解,跟着书敲了个例子,然后跟着代码走一遍才慢慢的理解的了这个设计模式,例子如下:
Person.class
// "Person"类
public class Person {
private String name;
public Person(){};
public Person(String name){
this.name=name;
};
public void Show(){
System.out.println("装扮的"+this.name);
}
}
Finery.class
// 服饰类
public abstract class Finery extends Person {
protected Person component;
public void Decorate(Person component){
this.component=component;
}
@Override
public void Show(){
if(component!=null){
component.Show();
}
}
}
TShirts.class
// T恤类
public class TShirts extends Finery{
@Override
public void Show(){
System.out.print("大T恤 ");
super.Show();
}
}
BigTrouser.class
// 大裤子类
public class BigTrouser extends Finery{
@Override
public void Show(){
System.out.print("大裤子 ");
super.Show();
}
}
Main.class
public class Main {
public static void main(String[] args) {
Person person=new Person("Lsw");
TShirts tShirts=new TShirts();
BigTrouser bigTrouser=new BigTrouser();
tShirts.Decorate(person);
bigTrouser.Decorate(tShirts);
bigTrouser.Show();
}
}
控制台输出:
大裤子 大T恤 装扮的Lsw
这个例子中,各个职责是通过装饰抽象类Finery中的component串联起来,就仿佛一个链表一样的结构,先初始化一个person然后对person进行装饰。
装饰模式的优点:
- 把类中的装饰功能从类中搬移出去,这样可以简化原有的类
- 有效的把类的核心职责和装饰功能区分开了,而且可以取出相关类中重复的装饰逻辑。
装饰模式的缺点:
- 装饰模式的装饰顺序异常重要,顺序错误可能会导致程序错误。