设计模式——装饰器模式

装饰器,简单来说是对某个对象进行装饰,动态的修改其方法的实现内容。

那么我们应该如何实现这样的功能呢,首先我们需要明白的是装饰器不会改变被装饰类的本身所具备对外的方法,只会动态的修改方法的实现。装饰器与被装饰对象是组合关系,想想现实生活中我们人和衣服的关系,我们人对外展示自己就可以看成一个方法show(),而衣服就是装饰器,当我们穿上衣服我们对外展示的虽然还是show(),但是展示的样子已然发生了变化,而要达到这个效果需要将我们人和衣服组合在一起。

而在代码中实现组合关系的一种方式就是变量引用,在装饰器中加入被装饰对象的引用即可。

而装饰器装饰完之后应该是返回被装饰后的对象,然后在调用被装饰后对象方法,但是在程序中这样动态的修改原本对象中的方法是不可行的,所以为了实现这个功能,就只能在装饰器中重新实现被装饰对象的方法。为了规范装饰器实现被装饰对象的方法可以使装饰器与被装饰类实现统一的接口即可,现在在脑海中基本可以行程装饰器模式的uml图了:


装饰类与被装饰类实现统一的接口,接口中声明了需要被修饰的方法,(变量的话也是可以通过方法访问修改就不提及啦)

使用抽象装饰类规范需要被修饰的方法中调用修饰变化的方法,在各个具体的装饰类实现类中实现各自的修饰变化的具体逻辑

其实在JAVA的IO类中就是使用了装饰器模式,稍有不同的是我们是规范接口而他是抽象类InputStream,装饰对象类有FileInputStream... 等,而装饰抽象类为FilterInputStream,装饰类的具体实现有DataInputStream...等。

这其中符合了开闭原则,里氏替换原则,单一职责

但也有缺点就是装饰层次过多会导致代码易读性下降,代码复杂。

个人的事例代码git项目地址为https://github.com/JackWuChengHao/designpattern

在此在说一说装饰器使用的场景吧,对于一个对象的某个有可能经常变化的功能可以将该功能提取到接口中。对外提供统一高层的抽象,这样当功能改变时,只需要调用端修改需要生成的类对象即可,当然这不是最好的做法,因为当变动时需要调用端的代码修改此时可以提供给前端工厂类,有工厂类产生客户端所需要的类对象,这个会在后面一节中谈到工厂类的时候在进行组合讲解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值