装饰器模式说明
装饰器模式(Decorator)能够在运行时动态地为原始对象增加一些额外的功能,使其变得更加强大
装饰器模式可以将不同功能的单个模块规划至不同的装饰器类中,各装饰器类独立自主,各司其职。客户端可以根据自己的需求自由搭配各种装饰器,每加一层装饰就会有新的特性体现出来,巧妙的设计让功能模块层层叠加,装饰之上套装饰,最终使原始对象的特性动态地得到增强
类似俄罗斯套娃
需要明白两个概念:装饰器和装饰者
装饰者:boy, 实现了行为接口,具备了基本的行为
行为接口:
装饰器抽象类:对装饰器的抽象,并实现了行为接口
-装饰器实现类:调用装饰器父类构造器,注入装饰者,如“好看的皮囊”、“有趣的灵魂”
实例代码
package com.azure.design.decorator;
/**
* 人类行为
*/
public interface Behavior {
public void show();
}
package com.azure.design.decorator;
/**
* 主角、装饰者,实现了行为接口
*/
public class Boy implements Behavior{
@Override
public void show() {
System.out.print("boy");
}
}
package com.azure.design.decorator;
/**
* 装饰器抽象并实现了行为接口
*/
public abstract class Decorator implements Behavior{
protected Behavior behavior;
public Decorator(Behavior behavior) {
this.behavior = behavior;
}
@Override
public void show() {
behavior.show(); // 直接调用不加任何装饰
}
}
package com.azure.design.decorator;
/**
* 好看的皮囊
*/
public class Skinbag extends Decorator{
public Skinbag(Behavior behavior) {
super(behavior); // 调用父类的构造器注入
}
@Override
public void show() {
System.out.print("好看的皮囊【");
behavior.show();
System.out.print("】");
}
}
package com.azure.design.decorator;
/**
* 有趣的灵魂
*/
public class Soul extends Decorator{
public Soul(Behavior behavior) {
super(behavior); // 调用父类的构造器注入
}
@Override
public void show() {
System.out.print("有趣的灵魂【");
behavior.show();
System.out.print("】");
}
}
package com.azure.design.decorator;
import org.junit.Test;
public class Client {
@Test
public void testDecorator() {
Skinbag boy = new Skinbag(new Soul(new Boy()));
boy.show();
}
}
// 输出
// 好看的皮囊【有趣的灵魂【大男孩】】
最终输出
// 输出
// 好看的皮囊【有趣的灵魂【boy】】