设计模式——装饰器模式
介绍
向一个现有对象添加新功能,而又不改变原结构。
意图
动态的给一个对象添加一些额外的职责。
解决
一般的,为了扩展类常常使用继承去实现,由于继承为类进入静态特征,并且随着功能的增多,子类会很膨胀。
优点
- 装饰类与被装饰类可以独立发展,不会相互耦合;
- 装饰模式是继承的一个替代模式,可以动态扩展一个实现类的功能。
缺点
- 多层装饰比较复杂。
使用场景
- 扩展类的功能;
- 动态增加功能,动态撤销。
UML
示例
House.java
package cn.geoaryblog.design.cretedg.decorator;
public interface House {
String desc();
}
NewHouse.java
package cn.geoaryblog.design.cretedg.decorator;
public class NewHouse implements House {
@Override
public String desc() {
return "新房子,刚刚领到了钥匙,还是毛坯房";
}
}
DecoratorHouse.java
package cn.geoaryblog.design.cretedg.decorator;
public class DecoratorHouse implements House {
private NewHouse house;
public DecoratorHouse(NewHouse house) {
this.house = house;
}
@Override
public String desc() {
String oldHouse = house.desc();
oldHouse += "\n开始装修\n";
oldHouse += "铺地\n";
oldHouse += "刷墙\n";
oldHouse += "买家电\n";
oldHouse += "完工\n";
return oldHouse;
}
}
Client.java
package cn.geoaryblog.design.cretedg.decorator;
public class Client {
public static void main(String[] args) {
House oldHouse = new NewHouse();
House decoraHouse = new DecoratorHouse(oldHouse);
System.out.println(oldHouse.desc());
System.out.println(decoraHouse.desc());
}
}
与代理模式的比较
- 相同点:
装饰者与被装饰者都实现同一个接口;
代理类与真实类都实现同一个接口;
- 不同点:
装饰器模式侧重于对原对象的扩展,即扩展后的对象仍然是对象本身(
DecoratorHouse(NewHouse house)
, house为原对象);代理模式则不会注重原对象,侧重于控制(
ProxyTicketing(int userid)
, userid为后续需要校验的条件),客户端只需要直到代理类即可,具体的实现交由代理类去实现,将客户端与实现类解构。
一句话:代理模式:代理与真实对象之间的关系在编译时缺点;装饰器模式:在运行时被缺点。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】