首页 > 代码库 > 【设计模式】装饰模式

【设计模式】装饰模式

刚看了看设计模式,真是费了好多的脑细胞。

想着想着就到了食堂。O(_)O哈!正是长身体的时候(大神勿喷),一定要多吃点。于是我打了一份米饭,然后又端着盛米饭的盘子买了一份菜 ,看着还不是很够,就又端着这个盘子买了一条最爱吃的鱼。-----装饰模式!

 

五一要来了。回家转转,没有小外甥的玩具怎么行。于是我去超市,推着购物车走了进去。三字经,恩不错,收下了。玩具车,恩,不错,收下了。一路上,推着购物车,把要买的东西就都放车里了。推着购物车结账就OK了---装饰模式!

 

等等,怎么就是装饰模式了?

 

概念


你看,装饰模式是什么?

为已有功能动态地添加更多功能的一种方式。也就是当系统仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为,需要新的功能的时候,向旧的类中添加新的代码。装饰模式把要装饰的功能放在单独的类中,并让这个类包装它要装饰的对象。当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择的按顺序的使用装饰功能包装对象了。

 

 让我们结合情景一想一想。本来我是买了一份米饭(已有功能),而我又想吃菜(特定情况的新需求),就在原有的盘子中添加菜。此处,菜是一个类,用它来“包装”我的晚饭。当然还可以用鱼用其他水果等来包装我的晚饭。


我们看一段“化妆后”的装饰模式的代码。


 

饭 meal=new 饭("晚饭");
米饭rice=new米饭();
菜vegetables= new 菜();
鱼fish = new 鱼();
rice.Decorate(meal);//此处是用rice来包装meal,相当于打了一份米饭
vegetables.Decorate(rice);//用vegetables来包装rice,相当于在盛米饭的盘子上又买菜
fish .Decorate(vegetables);//fish包装vegetables,相当于在盛米饭和菜的盘子上又买了鱼
fish.Show();//呈现出我的晚饭

 

结构图


以上,从细节上展示了装饰模式。以下,从整体上来了解一下。


     

此处如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以是ConCreteComponent的一个子类。同样道理,如果只有一个ConcreteDecorator类,那么就没有必要建立一个单独的Decorator类,而可以把DecoratorConcreteDecorator并成一个类。

 

实例中的结构图


接下来为了让我们更好的理解结构图。再来看一个大话设计模式中装饰模式的例子“穿什么有这么重要”,小菜要去约会,正考虑穿什么呢。

代码结构图为


 

 

此处是将上图简化了。直接让服饰类Decorator继承人类ConcreteComponent就可。

 

顺序


还有一点很重要。设计模式中是有顺序的,我们需要把所需功能按照正确的顺序串联起来进行控制。例如,加密数据和过滤词汇都可以是数据持久化前的装饰功能,若先加密在用过滤就会有问题。在例如,穿什么对小菜都是装饰,那先穿鞋在穿袜子就不大好了。。

 

 

总结


装饰模式,把类中的装饰功能从类中搬移去除,可以简化原有类。也有效地把类的核心职责和装饰功能区分开来,而且可以去除重复的装饰逻辑。

 

难得听我说了这么多,赶紧吃个夜宵去吧~

【设计模式】装饰模式