参考—>《大话之设计模式》感谢作者—org
先看一下结构图
装饰模式
如果只有一个ConcreteComponent类而没有抽象的Component类,那么
Decorator类可以是ConcreteComponent的一个子类
(在这儿的代码就是把Person这个ConcreteComponent类和Finery 这个Decorator类建立了父子关系)
同理
如果只有一个ConcreteDecorator那么也没必要建立一个单独的Decorator
类,而且可以把Decorator和ConcreteDecorator的责任合并成一个类。
代码—>
Person.java (ConcreteComponent)
package co.jp.li.concretecomponent;
public class Person {
private String name;
public Person() {
super();
}
public Person(String name) {
// super();
this.name = name;
}
public void show(){
System.out.print("を着ている"+this.name);
}
}
Finery.java(decorator)
package co.jp.li.decorator;
import co.jp.li.concretecomponent.Person;
public class Finery extends Person {
protected Person person;
public void Decorate(Person person) {
this.person = person;
}
@Override
public void show() {
// TODO Auto-generated method stub
if (person != null) {
person.show();
}
}
}
BigTrouser.java 和Kimono.java 和TShirt.java
package co.jp.li.concretedecorator;
import co.jp.li.decorator.Finery;
public class BigTrouser extends Finery {
@Override
public void show() {
// TODO Auto-generated method stub
System.out.print("BigTrouser" + "\t");
super.show();
}
}
package co.jp.li.concretedecorator;
import co.jp.li.decorator.Finery;
public class Kimono extends Finery {
@Override
public void show() {
// TODO Auto-generated method stub
System.out.print("着物\t");
super.show();
}
}
package co.jp.li.concretedecorator;
import co.jp.li.decorator.Finery;
public class TShirt extends Finery {
@Override
public void show() {
// TODO Auto-generated method stub
System.out.print("TShirt" + "\t");
super.show();
}
}
coursom.java 客户测试类—>
package co.jp.li.client;
import co.jp.li.concretecomponent.Person;
import co.jp.li.concretedecorator.BigTrouser;
import co.jp.li.concretedecorator.Kimono;
import co.jp.li.concretedecorator.TShirt;
public class coursom {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person person = new Person("佐藤");
System.out.print("衣装は--->");
TShirt tShirt = new TShirt();
BigTrouser bigTrouser = new BigTrouser();
Kimono kimono = new Kimono();
bigTrouser.Decorate(person);
tShirt.Decorate(bigTrouser);
kimono.Decorate(tShirt);
kimono.show();
}
}
总结—
装饰模式是为已有功能动态地添加更多功能的一种方式。
使用场合—
当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的
核心职责或主要行为,在主类中加入新的字段,方法,逻辑,从而增加了主类的复杂度。
装饰模式把每个要装饰的功能放在单独的类中,并让这个类包装他所要修饰的对象,因此,当需要执行特殊行为时,客户代码可以在运行时根据需要有选择地,按顺序的使用装饰功能包装对象了。
装饰顺序很重要!!!