装饰模式(学习笔记)

装饰模式

装饰模式(Decorator Pattern)还有一个名字,包装器(wrapper),后面的名字,更贴切。

适用场景(个人理解):

我们想动态扩展一个对象的功能,更具体的说:想在一个对象调用的某个方法之前或之后加一些操作,以扩展其功能。装饰模式让上述想法实现像穿衣服一样简单而优雅!

举例:我们想向一个组件加一个边框。

上述需求可以通过继承来实现,但是十分不灵活,假设你又想加一个滚动条,又得继承一次。突然你又觉得,这个边框不想要了,只能改,或者在原来的组件基础上再来一个继承。当你的想要各式各样的这种组件的时候,类会爆炸!!而且,显然,继承是无法实现动态扩展对象的!

下面看装饰模式是如何实现的,uml图如下:

解释:ConreteComponent是我们要装饰的对象的类。它和Decorator有共同的父类,父类中,一定要有被“装饰”的方法。Decorator是个空架子,他把所有事情都委托给了component来做,component是Decorator组合的一个父类对象。这个对象,就是我们要装饰的对象。ScollbarDecorator和BorderDecorator是具体的装饰类。看Borderdecorator注释可以知道,它的实现方法,就是在对象component执行完draw()之后,再画一个边框。

好处:

1. 最基本的:十分灵活,不改变类,直接动态的对对象扩展。就像在对象外边“裹”了一层东西一样方便。

2. 很容易实现“双份”,只要“裹”两次就可以了。

3. 在有大量独立扩展,并且有时需要这些独立扩展组合的时候,装饰模式非常实用。

使用方法:

以上述uml为例,我们想要一个既有滚动条,又有边框的组件:

Component component = newConcreteComponent();

Component Bcomponent = new BoarderComponent(component);//带有边框了

Component BScomponent = newScorllerBarComponent(Bcomponent);//带有滚动条了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值