一、概念
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活
二、使用场景
当需要向已有功能动态地添加更多功能,或者当系统需要新功能的时候,是向旧类中添加新的代码,这些新的代码通常装饰了原有类的核心职责或主要行为。装饰着模式把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择的、按顺序地使用装饰功能包装对象。
三、代码示例
程序共有7个类
Person.java
package decorator;
public class Person {
public Person() {
}
private String name;
public Person(String name) {
super();
this.name = name;
}
public void Show() {
System.out.println("装饰的"+name );
}
}
Finery.java
package decorator;
public class Finery extends Person{
protected Person component;
//打扮
public void Decorator(Person component) {
this.component=component;
}
@Override
public void Show() {
if (component!=null) {
component.Show();
}
}
}
BigTrouser.java
package decorator;
public class BigTrouser extends Finery{
@Override
public void Show() {
System.out.println("垮裤");
super.Show();
}
}
LeaderShoes.java
package decorator;
public class LeaderShoes extends Finery{
@Override
public void Show() {
System.out.println("皮鞋");
super.Show();
}
}
Sneakers.java
package decorator;
public class Sneakers extends Finery{
@Override
public void Show() {
System.out.println("球鞋");
super.Show();
}
}
Tshirs.java
package decorator;
public class Tshirs extends Finery{
@Override
public void Show() {
System.out.println("大T恤");
super.Show();
}
}
Main.java
package decorator;
import org.junit.Test;
public class Main {
@Test
public void test() {
Person person=new Person("小菜");
System.out.println("\n第一种装扮:");
Sneakers sneakers=new Sneakers();
BigTrouser bigTrouser=new BigTrouser();
Tshirs tshirs=new Tshirs();
sneakers.Decorator(person);
bigTrouser.Decorator(sneakers);
tshirs.Decorator(bigTrouser);
tshirs.Show();
System.out.println("\n第二种装扮:");
Tshirs tshirs2=new Tshirs();
LeaderShoes leaderShoes=new LeaderShoes();
Sneakers sneakers2=new Sneakers();
tshirs2.Decorator(person);
leaderShoes.Decorator(tshirs2);
sneakers2.Decorator(leaderShoes);
sneakers2.Show();
}
}
四、代码效果展示
第一种装扮:
大T恤
垮裤
球鞋
装饰的小菜
第二种装扮:
球鞋
皮鞋
大T恤
装饰的小菜
五、优点
装饰模式的有点就是,把类中的装饰功能从类中搬移去除,这样可以简化原有的类,这样做更大的好处在于,有效地把类的核心职责和装饰功能区分开,而且可以去除相关类重复的装饰逻辑