【设计模式】装饰器模式 详解

概述:
装饰器模式 就是使用 被装饰者 的一个实例,在客户端将 这个实例 交给 装饰器 及其 扩展类
动态地 将 新功能 附加到对象上
在 对象功能扩展 方面,它比 继承 更有 弹性
优缺点:
优点:
使用 装饰器模式,可以提供比继承 更灵活 地扩展对象的功能,
它可以 动态地 添加对象的功能,并且可以 随意地组合 这些功能
缺点:
正因为可以 随意组合,所以就可能出现一些 不合理的逻辑
使用展示:
首先,本人来给出一个需要包装的接口:
原接口:
package edu.youzg.design.pattern.decorator;
public interface Youzg {
void description();
}
本人再来给出一个 基础描述 的实现类:
基础实现类:
package edu.youzg.design.pattern.decorator;
public class YouzgCharacter implements Youzg {
@Override
public void description(){
System.out.println("Good man!");
}
}
现在,本人来给出一个 基于该实现类 的 包装器:
装饰器 类:
package edu.youzg.design.pattern.decorator;
public class YouzgDecorator implements Youzg{
private Youzg youzg;
public YouzgDecorator(Youzg youzg) {
this.youzg = youzg;
}
@Override
public void description() {
this.youzg.description();
}
}
现在,本人来对这个类进行 “声音描述” 和 “外貌描述” 的 包装:
装饰器 扩展类:
package edu.youzg.design.pattern.decorator;
public class YouzgVoice extends YouzgDecorator {
public YouzgVoice(Youzg youzg) {
super(youzg);
}
@Override
public void description() {
super.description();
System.out.println("磁性迷人的声音");
}
}
package edu.youzg.design.pattern.decorator;
public class YouzgAppearance extends YouzgDecorator{
public YouzgAppearance(Youzg youzg) {
super(youzg);
}
@Override
public void description() {
super.description();
System.out.println("风流倜傥");
}
}
那么,本人现在来给出一个测试类,来测试下经过两轮包装后,对 Youzg的描述:
测试类
package edu.youzg.design.pattern.decorator;
/**
* @Author: Youzg
* @CreateTime: 2021-05-10 19:58
* @Description: 带你深究Java的本质!
*/
public class YouzgTest {
public static void main(String[] args) {
Youzg youzg1 = new YouzgCharacter();
youzg1.description();
System.out.println("==========");
Youzg youzg2 = new YouzgVoice(youzg1);
youzg2.description();
System.out.println("==========");
Youzg youzg3 = new YouzgAppearance(youzg2);
youzg3.description();
}
}
现在,本人来展示下运行结果:

那么,至此,装饰器模式 就讲解完毕了!

浙公网安备 33010602011771号