装饰器模式
装饰器模式首先让人想到装修。我们用房子的装修来说明这个模式。首先,要装修需要有个房子。我们把各种房子抽象出一个“房子”这么一个抽象的概念,它有一个抽象的方法就是装修。具体房子就有商店,饭馆,公寓等。装饰器就是装修公司,他们都是针对房子装修,所以会关联房子。具体的装修公司有卫浴装修公司,地板装修公司,家具装修公司等。这些就构成整个装饰模式。
对于外部调用,首先得有个具体的房子,然后对这个房子做各种装修。比如,先构建一个饭馆,然后对他首先进行卫浴装修,再装地板,再装家具。也可以先装地板,家具,再进行卫浴。这就是装饰模式的有点之一:装饰类(装修公司)和被装饰类(房子)可以独立发展,不会相互耦合。另外,还可以动态扩展类。比如,我们新加入一个粉刷墙壁的公司。直接就可以再对房子进行粉刷装修,而不需要改变已经类。同理也可以动态的撤销一个类(比如去掉地板装修公司)。装饰模式是继承的一个替代模式。
代码如下:
interface House { public void decorate(); } class Resteraunt implements House { @Override public void decorate() { System.out.print("对饭店装修:"); } } class Apartment implements House { @Override public void decorate() { System.out.print("对公寓装修:"); } } class Company implements House { House house; public Company(House house) { this.house = house; } @Override public void decorate() { house.decorate(); } } class FloorCompany extends Company { public FloorCompany(House house) { super(house); } @Override public void decorate() { super.decorate(); System.out.print("装修地板,"); } } class KitchenCompany extends Company { public KitchenCompany(House house) { super(house); } @Override public void decorate() { super.decorate(); System.out.print("装修厨房,"); } } class BrushCompany extends Company { public BrushCompany(House house) { super(house); } @Override public void decorate() { super.decorate(); System.out.print("刷墙,"); } } class A{ A(int i){ } } class B extends A{ B(int i){ super(i); } } public class MainClass { public static void main(String[] args) { // 第一种写法 // House house = new Resteraunt(); // House brush = new BrushCompany(house); // House kitchen = new KitchenCompany(brush); // House floor = new FloorCompany(kitchen); // floor.decorate(); // 第二种写法 House house = new BrushCompany(new KitchenCompany( new FloorCompany(new Resteraunt()))); house.decorate(); System.out.print("房屋装修好了!"); } }
执行后输出:
对饭店装修:装修地板,装修厨房,刷墙,房屋装修好了!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2016-11-03 JBoss 系列十四:JBoss7/WildFly如何加载外部的文件或properties文件