




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、设计模式(Design Pattern),张凯 副教授 计算机学院 软件工程系,问题(Problem),个性QQ秀,问题(Problem),个性QQ秀,问题(Problem),class Person private string name; public Person(string name) = name; public void WearTShirts() Console.Write(T恤 ); public void WearJeans() Console.Write(牛仔裤 ); public void WearSneakers() Console.Write(球
2、鞋 ); public void WearSuit() Console.Write(西装 ); public void WearTrousers () Console.Write(西裤 ); public void WearLeatherShoes() Console.Write(皮鞋 ); public void Show() Console.WriteLine(装扮的0, name); ,问题(Problem),思考:不断添加新的衣服怎么办? 原则?,static void Main(string args) Person zs = new Person(张三); Console.Writ
3、eLine(n第一种装扮:); zs.WearTShirts(); zs.WearJeans(); zs.WearSneakers(); zs.Show(); Console.WriteLine(n第二种装扮:); zs.WearSuit(); zs.WearTrousers(); zs.WearLeatherShoes(); zs.Show(); Console.Read(); ,问题(Problem),问题(Problem),class Person private string name; public Person(string name) = name; publ
4、ic void Show() Console.WriteLine(装扮的0, name); ,问题(Problem),abstract class Finery /服饰 public abstract void Show(); class TShirts : Finery /T恤 public override void Show() Console.Write(T恤 ); class Jeans : Finery /牛仔裤 public override void Show() Console.Write(牛仔裤 ); class Sneakers : Finery /球鞋 public o
5、verride void Show() Console.Write(球鞋 ); ,问题(Problem),static void Main(string args) Person zs = new Person(张三); Console.WriteLine(n第一种装扮:); Finery tx = new TShirts(); Finery nzk = new Jeans(); Finery qx = new Sneakers(); tx.Show(); nzk.Show(); qx.Show(); zs.Show(); Console.WriteLine(n第二种装扮:); Finery
6、xz = new Suit(); Finery xk = new Trousers(); Finery px = new LeatherShoes(); xz.Show(); xk.Show(); px.Show(); zs.Show(); Console.Read(); ,问题(Problem),期望:内部组装完毕,再显示出来,tx.Show(); nzk.Show(); qx.Show(); zs.Show();,主要内容,装饰模式(Decorator Pattern),模式动机 模式名称:装饰模式 (Decorator) 有时我们希望给某个对象而不是整个类添加一些功能。例如:一个图形用户
7、界面工具箱允许我们对任意一个用户界面组件添加一些新的特性,如增加一个边框;或者增加一些行为,如窗口的滚动。,装饰模式(Decorator Pattern),模式动机 一种较为灵活的方式是将组件嵌入另一个对象中,由这个对象来添加边框。我们称这个嵌入的对象为装饰器(Decorator)。这个装饰与它所装饰的组件接口 一致,因此它对使用该组件的客户透明。它将客户请求转发给该组件,并且可 能在转发前后执行一些额外的动作。这种透明性使得我们可以递归嵌套多个装饰,从而可以添加任意多的功能。,装饰模式(Decorator Pattern),模式定义 装饰模式(Decorator Pattern):动态地给一
8、个对象增加一些额外的职责 (Responsibility),就增加对象功能来说,装饰模式比生成子类实现 更为灵活。其别名为包装器(Wrapper)。装饰模式是一种对象结构型模 式。,装饰模式(Decorator Pattern),模式结构,装饰模式(Decorator Pattern),参与者 Component:组件 ConcreteComponent:具体组件 Decorator:抽象装饰类 ConcreteDecorator:具体装饰类,装饰模式(Decorator Pattern),装饰模式(Decorator Pattern),abstract class Appearance pu
9、blic abstract void Show(); ,abstract class Finery : Appearance protected Appearance component; public void Decorate(Appearance component) ponent = component; public override void Show() if (component != null) component.Show(); ,class Person : Appearance private string name; public Person(string name
10、) = name; public override void Show() Console.WriteLine(装扮的0, name); ,装饰模式(Decorator Pattern),class TShirts : Finery public override void Show() base.Show(); Console.Write(T恤 ); class Jeans : Finery public override void Show() base.Show(); Console.Write(牛仔裤 ); class Sneakers : Finery publi
11、c override void Show() base.Show(); Console.Write(球鞋 ); ,装饰模式(Decorator Pattern),static void Main(string args) Person xc = new Person(小菜); Console.WriteLine(n第一种装扮:); Sneakers qx = new Sneakers(); Jeans nzk = new Jeans(); TShirts tx = new TShirts(); tx.Decorate(xc); nzk.Decorate(tx); qx.Decorate(nzk
12、); qx.Show(); Console.Read(); ,装饰模式(Decorator Pattern),Stack&Heap内存中如何执行?,装饰模式(Decorator Pattern),装饰模式(Decorator Pattern),23,例子:星巴克咖啡订单管理系统管理、计算各种饮料的售价。,Espresso浓缩咖啡,HouseBlend家常咖啡,DarkRoast深焙咖啡,Decaf脱咖啡因咖啡,Mocha摩卡,Milk蒸奶,Ice冰,装饰模式(Decorator Pattern),装饰模式(Decorator Pattern),如果有一张订单:“双倍摩卡豆浆奶泡拿铁咖啡”,应该
13、如何进行设计?,如果有一张订单:“奶泡摩卡加冰浓缩咖啡”,应该如何进行设计?,装饰模式(Decorator Pattern),26,实现1类爆炸 调料的增加/删除 调料价格的修改,装饰模式(Decorator Pattern),27,实现2:使用实例变量和继承,跟踪这些调料,装饰模式(Decorator Pattern),装饰模式(Decorator Pattern),29,问题:实现cost方法,装饰模式(Decorator Pattern),当哪些因素改变时会影响这个设计? 调料价钱的改变会使我们更改现有代码。 一旦出现新的调料,我们就需要加上新的方法,并改变超类中的cost()方法。 以
14、后可能会开发出新饮料,对于这些饮料而言(冰茶),某些调料可能并不适合,但是在这个设计方式中,Tea子类仍将继承那些不合适的方法,比如:hasWhip()。 如何顾客想要双倍摩卡,怎么办? ,装饰模式(Decorator Pattern),星巴克咖啡订单管理系统使用装饰者模式 以饮料(Beverage)为主体,然后在运行时以调料(Condiment)来装饰(decorate)饮料 比如,顾客想要摩卡和奶泡深焙咖啡,那么: 取出一个深焙咖啡(DarkRoast)对象 以摩卡(Mocha)对象装饰它 以奶泡(Whip)对象装饰它 调用cost方法,并依赖委托(delegrate)将调料的价格加上去,
15、装饰模式(Decorator Pattern),以DarkRoast对象开始 顾客需要摩卡(Mocha),所以建立一个Mocha对象,并用它将DarkRoast对象包起来,装饰模式(Decorator Pattern),顾客也想要奶泡(Whip),所以建立一个Whip装饰者,并用它将Mocha对象包起来,装饰模式(Decorator Pattern),通过调用最外圈装饰者(Whip)的cost即可计算饮料价格。,装饰模式(Decorator Pattern),35,问题:如果有一张订单:“双倍摩卡豆浆奶泡拿铁咖啡”,应该如何进行设计?,装饰模式(Decorator Pattern),装饰模式的
16、优缺点如下 使用装饰模式主要有以下的优点: 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。 这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错。,装饰模式(Decorator Pattern),装饰模式的优缺点如下 其缺点如下:采用装饰模式进行系统设计往往会产生许多看上去类似的小对象,这些对象仅仅在他们相互连接的方式上有所不同,而不是它们的类或是它们的属性值有所不同。尽管对于那些了解这些系统的人来说,很容易对它们进行定制,但是很难学习这些系统,排错也很困难。,装饰模式(Decorator Pattern),模式使用 在以下情况下适合使用装饰模式: 在不影响其它对象的情况下,以动态、透明的方式给单个对象添加职责。需要动态地给一个对象增加功能,这些功能可以再动态地被撤销。 当不能采用生成子类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广州合同范本模板
- 租赁合同纠纷律师函范本
- 移动厕所租赁协议
- 艺人签约合同模板
- 大豆油购销合同范本
- 《2025广告设计制作安装合同》
- 贷款利息减免协议书
- 广东省汕头市下蓬中学2025届高三下学期第四次周考生物试题试卷含解析
- 河南医学高等专科学校《室内设计2-居室空间设计》2023-2024学年第二学期期末试卷
- 太原幼儿师范高等专科学校《商业与技术双语》2023-2024学年第一学期期末试卷
- 普通心理学第六版PPT完整全套教学课件
- 北师大版八年级数学下册 (图形的平移)图形的平移与旋转新课件
- 危险化学品运输安全讲解
- 第二幼儿园-精准资助工作流程
- 一例糖尿病酮症酸中毒个案护理
- 《三气周瑜》儿童故事绘本ppt课件(图文演讲)
- GB/T 38472-2023再生铸造铝合金原料
- 初中美术-《手工书设计》教学课件设计
- 《城市轨道交通客服英语》课程标准
- 如何进行六年级数学总复习的讲座
- 保密工作会议上的讲话(6篇)
评论
0/150
提交评论