装饰器模式
组成
- 抽象组件角色(Component): 定义可以动态添加任务的对象的接口
- 具体组件角色(ConcreteComponent):定义一个要被装饰器装饰的对象,即 Component 的具体实现
- 抽象装饰器(Decorator): 维护对组件对象和其子类组件的引用
- 具体装饰器角色(ConcreteDecorator):向组件添加新的职责
结构图:
弱弱的说一下他的思路:
Component是定义一个对象接口,为对象动态的添加职责。ConcreteComponent是定义了一个具体对象,也可以给这个对象添加一些职责。
Decorator,装饰抽象类,继承了Components,从外类来扩展Component类的功能。但是对于Component来说。无需知道Decorator的存在的。至于ConcreteDecorator就是具体装饰对象,起到给Component添加职责的功能、
再深入变通一下,假如只有ConcreteComponent类没有抽象的Component类,那么Decorator类可以是ConcreteComponent的一个子类。同理,如果过只有一个ConcreteDecorator,就没必要单独建立一个Decorator,所以我们就可以把这个Decorator类和ConcreteDecorator类的合并成一个类了呀。这样直接让哦我们的服饰类Decorator类直接继承ConcreteComponent就可以了。
实现
Peson类
public class person {
private String name;
public person() {
}
public person(String name) {
this.name = name;
}
public void show() {
System.out.println( "装扮的" + name );
}
}
Decorator类
public class Finery extends person{
protected person component;
/**
* 打扮
* @param component
*/
public void decorate(person component){
this.component = component;
}
@Override
public void show(){
if (null != component){
component.show();
}
}
}
具体服饰类ConcreteDecorator
/**具体服饰类bigTrouser*/
public class bigTrouser extends Finery{
@Override
public void show(){
System.out.print("垮裤\t");
super.show();
}
}
/**具体服饰类tshirts*/
public class tshirts extends Finery {
@Override
public void show(){
System.out.print("大T恤\t");
super.show();
}
}
其他的太多了就不一一列举了。
客服端
/**
* @author:pier 2021/11/15
**/
/**客服端*/
public class Main {
public static void main(String[] args) {
person person = new person("Java_Pier~呀");
System.out.println("第一种装扮");
wearSneakers sneakers = new wearSneakers();
bigTrouser bigTrouser = new bigTrouser();
tshirts tShirts = new tshirts();
sneakers.decorate(person);
bigTrouser.decorate(sneakers);
tShirts.decorate(bigTrouser);
tShirts.show();
System.out.println("第二种装扮");
wearLeathershoes leatherShoes = new wearLeathershoes();
wearTie tie = new wearTie();
wearSuit suit = new wearSuit();
leatherShoes.decorate(person);
tie.decorate(leatherShoes);
suit.decorate(tie);
suit.show();
}
}
实现结果
第一种装扮
大T恤 垮裤 破球鞋 装扮的Java_Pier~呀
第二种装扮
西装 领带 皮鞋 装扮的Java_Pier~呀
进程已结束,退出代码为 0
总结上述优点:
把类中的装饰功能去除,简化原有的类。
实现结果*
第一种装扮
大T恤 垮裤 破球鞋 装扮的Java_Pier~呀
第二种装扮
西装 领带 皮鞋 装扮的Java_Pier~呀
进程已结束,退出代码为 0
总结上述优点:
把类中的装饰功能去除,简化原有的类。
有效的那核心职责和装饰功能区分开。
参考:《大话设计模式》