大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。
装饰设计模式就是对已有的对象的功能进行增强
简单小例子:
class Person { void chifan() { System.out.println("chifan"); } } /* 为了不随便改变原有的代码。 还要增强chifan功能。 那么就定义一个类,对原有对象进行装饰。 by 何问起 */ 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(); } } // hovertree.com
我们考虑一下使用继承也可以对父类中的功能进行增强只需要调用super就可以调用父类的方法,那使用装饰和继承有什么区别?
使用继承体系就会有点臃肿,因为当平房想要改成欧式时,还要建立子类。
Writer
|–FileWriter
|–BufferedFileWriter。
|–DataWriter
|–BufferedDataWriter。
|–MediaWriter
|–BufferedMediaWriter.
优化:
可以将缓冲技术单独抽取进行封装。
要缓冲区谁将谁和缓冲相关联即可。
这样的设计的相对体系会变的简单。
使用继承带来的局限性:
/* 房子:平房,楼房。 House |--PingFang |--LouFang 准备对房子进行装修。 1,对平房进行田园风光式的打造。 2,对楼房进行欧式风格的打造。 可以用继承的方式来完成。 House |--PingFang |--TianYuanPingFang |--LouFang |--OuShiLouFang 该体系就有点臃肿,因为当平房想要改成欧式时,还要建立子类。 何问起 hovertree.com */ 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 无论将平房打造成田园还是欧式,都是对平房一种装修。 而该装修也可以用楼房。 by 何问起 hovertree.com 将现将该装修定义好,需要把什么房子进行改装修,传入即可。 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(); } }
转自:http://hovertree.com/h/bjaf/zhuangshi.htm
推荐:http://www.cnblogs.com/roucheng/p/chengxuyuan.html
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/120587.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...