我们的主人公大维德是江苏泰兴中部一个小县城的一个暴发户的儿子,他不学无术,仗着家里开了一个厂,有着3个宅基地,好吃懒做,不学无术,这种人呀,也就表面上 看上去是个人,我们看一下他的日常睡觉,就一个睡觉都能被玩出花样来。
想要实现装饰器模式,需要有以下四样东西:
- 抽象构件接口:定义具体构件类的接口。
- 具体构件类(被装饰类):实现抽象构件接口,抽象组件的具体实现。
- 装饰抽象类:实现抽象构件,规定实现类要实现的方法,并组合具体构建类的对象。
- 具体装饰类:继承装饰抽象类,实现方法。
/**
*
* 抽象构件接口:定义可以动态添加任务的对象的接口
* 一条狗
*/
public interface Component {
void say();
String sleep();
}
/**
* 具体构件类:定义一个要被装饰器装饰的对象
* 例如大维德
*/
class DavidComponent implements Component{
@Override
public void say() {
System.out.println("你好,我叫大维德,我家开厂的,窈窕淑女,君子好逑!。");
}
@Override
public String sleep() {
return "睡觉";
}
}
/**
* 装饰抽象类:Decorator:维护对象和其子类的引用
*/
public abstract class Decorator implements Component{
// 每个装饰者都包装一个组件
Component component;
@Override
public void say() {
component.say();
}
}
具体的装饰类:金莲、w红
/**
* 具体装饰类: 金莲
* 向对象添加新的功能或行为特征
*/
class CheMoDecorator extends Decorator{
public CheMoDecorator(Component component) {
this.component = component;
}
@Override
public String sleep() {
return "约金莲" + component.sleep();
}
}
/**
* 具体装饰类: w红
* 向对象添加新的功能或行为特征
*/
class WangHongDecorator extends Decorator{
public WangHongDecorator(Component component) {
this.component = component;
}
@Override
public String sleep() {
return "约个科技身材的w红" + component.sleep();
}
}
测试类:
public class DecoratorTest {
public static void main(String[] args) {
DavidComponent david = new DavidComponent();
david.say();
System.out.println(david.sleep());
System.out.println("-------------------");
PanJinLianDecorator panJinLian = new PanJinLianDecorator(david);
panJinLian.say();
System.out.println(panJinLian.sleep());
System.out.println("----- 约一个 不过瘾,再加一个 ---");
// 在不影响其他对象的情况下,快速动态透明地为单个对象添加功能
WangHongDecorator wangHongDecorator = new WangHongDecorator(panJinLian);
wangHongDecorator.say();
System.out.println(wangHongDecorator.sleep());
}
}
运行结果:
你好,我叫大维德,我家开厂的,我只会吃喝
睡觉
-------------------
你好,我叫大维德,我家开厂的,我只会吃喝。
约个金莲睡大大觉
----- 一个不过瘾,再加一个 ---
你好,我叫大维德,我家开厂的,我只会吃喝。
约个科技身材的w红,约个金lian睡觉
总结:
装饰者模式可以带来比继承更加灵活性的扩展功能,使用更加方便,可以通过组合不同的装饰者对象来获取具有不同行为状态的多样化的结果。
装饰者模式,就是装饰者(Docorator)需要继承与被装饰者(Component),并且持有被装饰者的引用(Component)