PHP - 设计模式之 装饰器模式

装饰器模式

1、装饰器模式(Decorator),可以动态地添加修改类的功能

2、一个类提供了一项功能,如果要修改并添加额外的功能,传统的编程模式,需要写一个子类去继承它,并重新实现类的方法。

3、使用装饰器模式,仅仅需要在运行时,添加一个装饰器对象即可实现,可以实现最大的灵活性。

 

代码部分

注意:这里借用"原型模式"的canvas的类,来对装饰器模式进行实现。

1、如果想要给画的图,进行装饰,比如,给图设定个颜色,传统的方式该如何实现?

传统编程方式,就是在draw方法前后,添加修饰属性。若仅仅是增加一两个属性,这种方式,没有问题,但是,如果有多重属性要进行修饰,这种方法,将会变得很臃肿,非常不利扩展。

 

2、这时,装饰器模式,就闪亮登场了,因为,我们在实际应用开发中,远远比预想的要复杂,所以,要保证代码的解耦、复用、简洁、高效,就必须选用优质的模式——装饰器。

 

3、那么,装饰器模式该如何实现呢?借用canvas类,对其所画的图,进行颜色、大小的装饰。首先,定义一个装饰器接口,接口中,两个待实现的方法,beforeDraw和afterDraw,如下:

 

4、这个时候,我们需要定义两个装饰类型装饰器类,装饰颜色的colorDrawDecorator类,装饰大小的sizeDrawDecorator类,用以对drawDecorator接口,进行实现!

colorDrawDecorator类

sizeDrawDecorator类

 

5、那么,具体地放到画图类中,我们要如何完美地,将装饰器模式应用其中呢?下看代码:

动态地加载装饰器类,是个难点!理解上,也是个难点!另外,调用装饰器方法,在是实现绘画前的方法,要对装饰器器容器中的每个元素遍历,然后,实现绘画前方法,对每个“*”添加“属性”,每个点“*”都需要添加属性,绘画后方法,也需同样,加属性结束标签。

但是,绘画后方法,需要对装饰器容器进行反转,这个怎么理解呢,就是在对每个元素添加“前属性标签”,装饰器容器中的内容,最后一个就放到了第一个元素位置,第一个放到了最后一位,反转一下,刚刚对上。然后,再顺序对每个容器元素,添加绘画后方法,即添加“结束属性标签”。

 

6、最后,就是调用了。

这里,我们只实例了一次Canvas类,然后,对绘图操作,增加了两个装饰,颜色和大小,加了装饰,效果怎么样呢,通过浏览器,看一下:

如果我们不想用颜色装饰器,直接注释就可以,想用了,再放开,也不影响,很方便

浏览器:

 

总结:

装饰器模式,方便的地方,就是低耦合、可拆可卸,但,难点在于,将装饰器类动态地加载到应用类里面,再对装饰器接口,进行实现,这块得理解清楚,细心操作,才会让装饰器真正意义上发挥作用。调用的时候,就方便了,可用可卸!总之,多操作,多应用,多想,才能熟练为之!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章