关于装饰设计模式
设计模式就是解决一类问题而行之有效的方法,装饰设计模式就是解决,对 已有对象进行功能增强,而又不去改变对象本身的问题。
简单小例子:
- 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.
优化:
可以将缓冲技术单独抽取进行封装。
要缓冲区谁将谁和缓冲相关联即可。
这样的设计的相对体系会变的简单。