装饰设计模式
关于装饰设计模式
设计模式就是解决一类问题而行之有效的方法,装饰设计模式就是解决,对 已有对象进行功能增强,而又不去改变对象本身的问题。
简单小例子:
- class Person
- {
- void chifan()
- {
- System.out.println("chifan");
- }
- }
- /*
- 为了不随便改变原有的代码。
- 还要增强chifan功能。
- 那么就定义一个类,对原有对象进行装饰。
- */
- class NewPerson
- {
- private Person p;
- NewPerson(Person p)
- {
- this.p = p;
- }
- public void newChifan()
- {
- System.out.println("来一杯");
- p.chifan();
- System.out.println("来一根");
- }
- }
- class PersonDemo
- {
- public static void main(String[] args)
- {
- Person p = new Person();
- //NewPerson np = new NewPerson(p);
- //np.newChifan();
- p.chifan();
- }
- }
在这个例子中,就是通过定义了一个NewPerson类来和Person类关联,只需通过传参让Person类和装饰类关联扩展Person对象的功能。
使用继承带来的局限性:
- /*
- 房子:平房,楼房。
- House
- |--PingFang
- |--LouFang
- 准备对房子进行装修。
- 1,对平房进行田园风光式的打造。
- 2,对楼房进行欧式风格的打造。
- 可以用继承的方式来完成。
- House
- |--PingFang
- |--TianYuanPingFang
- |--LouFang
- |--OuShiLouFang
- 该体系就有点臃肿,因为当平房想要改成欧式时,还要建立子类。
- */
- abstract class House
- {
- abstract void show();
- }
- class PingFang extends House
- {
- public void show()
- {
- System.out.println("平房");
- }
- }
- class TianYuanPingFang extends PingFang
- {
- public void showTianYuan()
- {
- super.show();
- System.out.println("田园风格");
- }
- }
- class LouFang extends House
- {
- public void show()
- {
- System.out.println("楼房");
- }
- }
- class OuShiLouFang extends LouFang
- {
- public void showOuShi()
- {
- super.show();
- System.out.println("欧式风格");
- }
- }
- class HouseDemo
- {
- public static void main(String[] args)
- {
- PingFang p = new PingFang();
- ///p.show();
- TianYuanPingFang t = new TianYuanPingFang();
- t.showTianYuan();
- LouFang l = new LouFang();
- //l.show();
- OuShiLouFang o = new OuShiLouFang();
- o.showOuShi();
- }
- }
使用装饰设计模式进行装饰:
- /*
- 原体系:
- House
- |--PingFang
- |--LouFang
- 无论将平房打造成田园还是欧式,都是对平房一种装修。
- 而该装修也可以用楼房。
- 将现将该装修定义好,需要把什么房子进行改装修,传入即可。
- House
- |--PingFang
- |--LouFang
- |--TianYuan
- |--OuShi
- */
- abstract class House
- {
- abstract void show();
- }
- class PingFang extends House
- {
- public void show()
- {
- System.out.println("平房");
- }
- }
- class LouFang extends House
- {
- public void show()
- {
- System.out.println("楼房");
- }
- }
- class TianYuan extends House
- {
- private House h;
- TianYuan(House h)
- {
- this.h = h;
- }
- public void show()
- {
- System.out.println("田园风格");
- }
- public void showTianYuan()
- {
- h.show();
- this.show();
- }
- }
- class OuShi extends House
- {
- private House h;
- OuShi(House h)
- {
- this.h = h;
- }
- public void show()
- {
- System.out.println("欧式风格");
- }
- public void showOuShi()
- {
- h.show();
- this.show();
- }
- }
- class HouseDemo2
- {
- public static void main(String[] args)
- {
- PingFang p = new PingFang();
- LouFang l = new LouFang();
- OuShi o = new OuShi(new TianYuan(p));
- o.showOuShi();
- //TianYuan t = new TianYuan(l);
- //t.showTianYuan();
- //OuShi o = new OuShi(l);
- //o.showOuShi();
- }
- }
- Writer
|--FileWriter
|--BufferedFileWriter。
|--DataWriter
|--BufferedDataWriter。
|--MediaWriter
|--BufferedMediaWriter.
优化:
可以将缓冲技术单独抽取进行封装。
要缓冲区谁将谁和缓冲相关联即可。
这样的设计的相对体系会变的简单。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 解决跨域问题的这6种方案,真香!
· 分享4款.NET开源、免费、实用的商城系统
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库