Decorator模式(装饰模式 结构型)

来源:互联网 发布:linux 查看显存占用 编辑:程序博客网 时间:2024/05/16 00:47

当要为一个已存在的类,增添新的功能时,一般的会有两种做法,改变或者继承。改变的意思是直接在该类上新增功能:好处是够直接,坏处是会对已有的架构产生较大影响,破坏开源闭合原则。而继承是比较明朗的做法,但坏处是类的继承深度会加深,且增加职责是静态的,不够灵活。

有一种方法较Decorator模式,它提供一种方法,即不使用继承的方法,而通过新增 添职责的类,起到为该类动态增加功能的作用,其结构如下:


以下情况适用decorator模式

1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

2)处理那些可以撤消的职责。

3)当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

举个栗子

一家卖面条的,提供鸡蛋面和牛肉面两种选择,然后还有其他配菜选项,如牛肉面可以加1个蛋,也可以加10个蛋,鸡蛋面也可以加牛肉。用户选择加几个蛋,都可以动态地去增加,十分灵活。以下为UML图。


我想点一份鸡蛋面,再加2个鸡蛋和1份牛肉,代码是这么实现的:

Noodle* noodle = new EggNoodle(); //点一份鸡蛋面

Noodle* oneEggNoodle = new AddEgg(noodle); //加个蛋

Noodle* twoEggNoodle = new AddEgg(oneeggNoodle);//再加一个蛋

Noodle* totalNoddle = new AddBeef(twoEggNoodle);//加牛肉

printf(“ 购买了: %s, 共消费:%lf ”,totalNoodle->GetDescription().c_str(),totalNoodle->cost() );

可以专心吃面了哈!
0 0
原创粉丝点击