介绍
动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
使用
public class Decorator {
public static void main(String[] args) {
Person person = new Person();
person.setName("Tom");
TShirt tShirt = new TShirt();
tShirt.Decorate(person);
BigShoe bigShoe = new BigShoe();
bigShoe.Decorate(tShirt);
Jeans jeans = new Jeans();
jeans.Decorate(bigShoe);
jeans.show();
}
}
/**
* 装饰功能
*/
interface Dressing{
void show();
}
/**
* 本尊
*/
class Person implements Dressing{
private String name;
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.printf("装扮的%s",name);
}
}
/**
* 装饰器
*/
class Finery implements Dressing{
private Dressing component;
public void Decorate(Dressing component){
this.component = component;
}
public void show() {
if (component != null){
component.show();
}
}
}
/**
* 装饰物
*/
class TShirt extends Finery{
@Override
public void show() {
System.out.println("T-shirt");
super.show();
}
}
/**
* 装饰物
*/
class Jeans extends Finery{
@Override
public void show() {
System.out.println("Jeans");
super.show();
}
}
/**
* 装饰物
*/
class BigShoe extends Finery{
@Override
public void show() {
System.out.println("BigShoe");
super.show();
}
}
特点
有效的把类的核心职责和装饰功能区分开,可以去除相关类的重复的装饰逻辑