设计模式装饰模式Decorator.pptx
- 文档编号:18714917
- 上传时间:2023-10-17
- 格式:PPTX
- 页数:40
- 大小:4.27MB
设计模式装饰模式Decorator.pptx
《设计模式装饰模式Decorator.pptx》由会员分享,可在线阅读,更多相关《设计模式装饰模式Decorator.pptx(40页珍藏版)》请在冰点文库上搜索。
设计模式(DesignPattern),问题(Problem),个性QQ秀,问题(Problem),个性QQ秀,问题(Problem),classPersonprivatestringname;publicPerson(stringname)this.name=name;publicvoidWearTShirts()Console.Write(T恤);publicvoidWearJeans()Console.Write(牛仔裤);publicvoidWearSneakers()Console.Write(球鞋);publicvoidWearSuit()Console.Write(西装);publicvoidWearTrousers()Console.Write(西裤);publicvoidWearLeatherShoes()Console.Write(皮鞋);publicvoidShow()Console.WriteLine(装扮的0,name);,问题(Problem),思考:
不断添加新的衣服怎么办?
原则?
staticvoidMain(stringargs)Personzs=newPerson(张三);Console.WriteLine(n第一种装扮:
);zs.WearTShirts();zs.WearJeans();zs.WearSneakers();zs.Show();Console.WriteLine(n第二种装扮:
);zs.WearSuit();zs.WearTrousers();zs.WearLeatherShoes();zs.Show();Console.Read();,问题(Problem),问题(Problem),classPersonprivatestringname;publicPerson(stringname)this.name=name;publicvoidShow()Console.WriteLine(装扮的0,name);,问题(Problem),abstractclassFinery/服饰publicabstractvoidShow();classTShirts:
Finery/T恤publicoverridevoidShow()Console.Write(T恤);classJeans:
Finery/牛仔裤publicoverridevoidShow()Console.Write(牛仔裤);classSneakers:
Finery/球鞋publicoverridevoidShow()Console.Write(球鞋);,问题(Problem),staticvoidMain(stringargs)Personzs=newPerson(张三);Console.WriteLine(n第一种装扮:
);Finerytx=newTShirts();Finerynzk=newJeans();Fineryqx=newSneakers();tx.Show();nzk.Show();qx.Show();zs.Show();Console.WriteLine(n第二种装扮:
);Fineryxz=newSuit();Fineryxk=newTrousers();Finerypx=newLeatherShoes();xz.Show();xk.Show();px.Show();zs.Show();Console.Read();,问题(Problem),期望:
内部组装完毕,再显示出来,tx.Show();nzk.Show();qx.Show();zs.Show();,主要内容,装饰模式(DecoratorPattern),模式动机模式名称:
装饰模式(Decorator)有时我们希望给某个对象而不是整个类添加一些功能。
例如:
一个图形用户界面工具箱允许我们对任意一个用户界面组件添加一些新的特性,如增加一个边框;或者增加一些行为,如窗口的滚动。
装饰模式(DecoratorPattern),模式动机一种较为灵活的方式是将组件嵌入另一个对象中,由这个对象来添加边框。
我们称这个嵌入的对象为装饰器(Decorator)。
这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。
它将客户请求转发给该组件,并且可能在转发前后执行一些额外的动作。
这种透明性使得我们可以递归嵌套多个装饰,从而可以添加任意多的功能。
装饰模式(DecoratorPattern),模式定义装饰模式(DecoratorPattern):
动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。
其别名为包装器(Wrapper)。
装饰模式是一种对象结构型模式。
装饰模式(DecoratorPattern),模式结构,装饰模式(DecoratorPattern),参与者Component:
组件ConcreteComponent:
具体组件Decorator:
抽象装饰类ConcreteDecorator:
具体装饰类,装饰模式(DecoratorPattern),装饰模式(DecoratorPattern),abstractclassAppearancepublicabstractvoidShow();,abstractclassFinery:
AppearanceprotectedAppearancecomponent;publicvoidDecorate(Appearancecomponent)ponent=component;publicoverridevoidShow()if(component!
=null)component.Show();,classPerson:
Appearanceprivatestringname;publicPerson(stringname)this.name=name;publicoverridevoidShow()Console.WriteLine(装扮的0,name);,装饰模式(DecoratorPattern),classTShirts:
FinerypublicoverridevoidShow()base.Show();Console.Write(T恤);classJeans:
FinerypublicoverridevoidShow()base.Show();Console.Write(牛仔裤);classSneakers:
FinerypublicoverridevoidShow()base.Show();Console.Write(球鞋);,装饰模式(DecoratorPattern),staticvoidMain(stringargs)Personxc=newPerson(小菜);Console.WriteLine(n第一种装扮:
);Sneakersqx=newSneakers();Jeansnzk=newJeans();TShirtstx=newTShirts();tx.Decorate(xc);nzk.Decorate(tx);qx.Decorate(nzk);qx.Show();Console.Read();,装饰模式(DecoratorPattern),Stack&Heap内存中如何执行?
装饰模式(DecoratorPattern),装饰模式(DecoratorPattern),23,例子:
星巴克咖啡订单管理系统管理、计算各种饮料的售价。
Espresso浓缩咖啡,HouseBlend家常咖啡,DarkRoast深焙咖啡,Decaf脱咖啡因咖啡,Mocha摩卡,Milk蒸奶,Ice冰,装饰模式(DecoratorPattern),装饰模式(DecoratorPattern),如果有一张订单:
“双倍摩卡豆浆奶泡拿铁咖啡”,应该如何进行设计?
如果有一张订单:
“奶泡摩卡加冰浓缩咖啡”,应该如何进行设计?
装饰模式(DecoratorPattern),26,实现1类爆炸调料的增加/删除调料价格的修改,装饰模式(DecoratorPattern),27,实现2:
使用实例变量和继承,跟踪这些调料,装饰模式(DecoratorPattern),装饰模式(DecoratorPattern),29,问题:
实现cost方法,装饰模式(DecoratorPattern),当哪些因素改变时会影响这个设计?
调料价钱的改变会使我们更改现有代码。
一旦出现新的调料,我们就需要加上新的方法,并改变超类中的cost()方法。
以后可能会开发出新饮料,对于这些饮料而言(冰茶),某些调料可能并不适合,但是在这个设计方式中,Tea子类仍将继承那些不合适的方法,比如:
hasWhip()。
如何顾客想要双倍摩卡,怎么办?
装饰模式(DecoratorPattern),星巴克咖啡订单管理系统使用装饰者模式以饮料(Beverage)为主体,然后在运行时以调料(Condiment)来装饰(decorate)饮料比如,顾客想要摩卡和奶泡深焙咖啡,那么:
取出一个深焙咖啡(DarkRoast)对象以摩卡(Mocha)对象装饰它以奶泡(Whip)对象装饰它调用cost方法,并依赖委托(delegrate)将调料的价格加上去,装饰模式(DecoratorPattern),以DarkRoast对象开始顾客需要摩卡(Mocha),所以建立一个Mocha对象,并用它将DarkRoast对象包起来,装饰模式(DecoratorPattern),顾客也想要奶泡(Whip),所以建立一个Whip装饰者,并用它将Mocha对象包起来,装饰模式(DecoratorPattern),通过调用最外圈装饰者(Whip)的cost即可计算饮料价格。
装饰模式(DecoratorPattern),35,问题:
如果有一张订单:
“双倍摩卡豆浆奶泡拿铁咖啡”,应该如何进行设计?
装饰模式(DecoratorPattern),装饰模式的优缺点如下使用装饰模式主要有以下的优点:
装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。
通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错。
装饰模式(DecoratorPattern),装饰模式的优缺点如下其缺点如下:
采用装饰模式进行系统设计往往会产生许多看上去类似的小对象,这些对象仅仅在他们相互连接的方式上有所不同,而不是它们的类或是它们的属性值有所不同。
尽管对于那些了解这些系统的人来说,很容易对它们进行定制,但是很难学习这些系统,排错也很困难。
装饰模式(DecoratorPattern),模式使用在以下情况下适合使用装饰模式:
在不影响其它对象的情况下,以动态、透明的方式给单个对象添加职责。
需要动态地给一个对象增加功能,这些功能可以再动态地被撤销。
当不能采用生成子类的方法进行扩充时。
一种情况是,可能有大量独立的扩展,每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。
另一种情况可能是因为类定义不能继承(final类),或类不能用于生成子类。
装饰模式(DecoratorPattern),需要注意的问题一个装饰类的接口必须与被装饰类的接口保持相同,对于客户端来说无论是装饰之前的对象还是装饰之后的对象都可以一致对待。
尽量保持具体构件类Component作为一个“轻”类,也就是说不要把太多的逻辑和状态放在具体构件类中,可以通过装饰类对其进行扩展。
ThankYou!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 模式 装饰 Decorator