92面向对象设计模式与设计原则

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

9模式的分类模式的分类((gofgof提出的提出的2323个个))行为型行为型ChainofResponsibilityChainofResponsibilityCommandCommandIteratorIteratorMediatorMediatorMementoMementoObserverObserverStateStateStrategyStrategyVisitorVisitorAdapter(Adapter(对象对象))BridgeBridgeCompositeCompositeDecoratorDecoratorFacadeFacadeFlyweightFlyweightProxyProxyAbstractFactoryAbstractFactoryBuilderBuilderPrototypePrototypeSingletonSingleton对对象象InterpreterInterpreterTemplateMethodTemplateMethodAdapter(Adapter(类类))FactoryMethodFactoryMethod类类结构型结构型创建型创建型11Bridge(Bridge(桥梁桥梁))模式模式最初的设计最初的设计12Bridge(Bridge(桥梁桥梁))模式模式需求变化:鸟类要会飞需求变化:鸟类要会飞13Bridge(Bridge(桥梁桥梁))模式模式如果增加一种鸟类如果增加一种鸟类““企鹅企鹅””呢?呢?14Bridge(Bridge(桥梁桥梁))模式模式改进方法:对改进方法:对““飞飞””使用多态使用多态15Bridge(Bridge(桥梁桥梁))模式模式改进方法:再次使用继承改进方法:再次使用继承16Bridge(Bridge(桥梁桥梁))模式模式如果增加如果增加““游泳游泳””行为呢?行为呢?18设计原则:组合优先设计原则:组合优先继承复用的优点继承复用的优点可以很容易的修改或扩展父类的实现可以很容易的修改或扩展父类的实现22设计原则:组合优先设计原则:组合优先如果使用继承来描述:如果使用继承来描述:一旦增加新的汽车种类或用途,都需要一旦增加新的汽车种类或用途,都需要大量改动原有代码大量改动原有代码23设计原则:组合优先设计原则:组合优先使用使用““组合组合””思路考虑问题思路考虑问题““汽车汽车””拥有某种或某些拥有某种或某些““用途用途””““汽车汽车””和和““用途用途””独立变化,互不影响独立变化,互不影响24设计原则:组合优先设计原则:组合优先区分区分““IsIs--AA””与与““HasHas--AA””有一个系统需要描述经理、雇员和学生有一个系统需要描述经理、雇员和学生它们都是人,所以:它们都是人,所以:25设计原则:组合优先设计原则:组合优先问题问题有些人既是经理,又是学生,比如某位有些人既是经理,又是学生,比如某位在读在读MBAMBA的老总的老总26设计原则:组合优先设计原则:组合优先换一个角度看问题换一个角度看问题雇员、经理、学生其实都是角色的一种雇员、经理、学生其实都是角色的一种人拥有角色人拥有角色28Bridge(Bridge(桥梁桥梁))模式模式““发现变化点发现变化点””29Bridge(Bridge(桥梁桥梁))模式模式““封装变化点封装变化点””变化点变化点11:小鸟一家:小鸟一家30Bridge(Bridge(桥梁桥梁))模式模式““封装变化点封装变化点””变化点变化点22:鸟类的行为:鸟类的行为————飞飞31Bridge(Bridge(桥梁桥梁))模式模式““封装变化点封装变化点””变化点变化点22:鸟类的行为:鸟类的行为————游泳游泳33鸟儿拥有飞、游泳的行为鸟儿拥有飞、游泳的行为35Bridge(Bridge(桥梁桥梁))模式模式37Bridge(Bridge(桥梁桥梁))模式模式结构结构39Bridge(Bridge(桥梁桥梁))模式模式应用举例应用举例11::““小朋友画画小朋友画画””使用蜡笔使用蜡笔需要大中小三种型号需要大中小三种型号每种型号各有每种型号各有1212种颜色种颜色共共3636支支40Bridge(Bridge(桥梁桥梁))模式模式使用毛笔:使用毛笔:大、中、小大、中、小33支毛笔支毛笔1212种颜料种颜料42Bridge(Bridge(桥梁桥梁))模式模式应用举例应用举例22有一个有一个CADCAD软件,可以画多种图形软件,可以画多种图形同时支持多套绘图算法同时支持多套绘图算法传统的设计传统的设计ShapeDraw()RectangleDraw()CircleDraw()V1RectangleV2RectangleV1CircleV2Circle43Bridge(Bridge(桥梁桥梁))模式模式应用应用BridgeBridge模式模式V1DrawingDrawLine()DrawCircle()V2DrawingDrawLine()DrawCircle()RectangleDraw()CircleDraw()ShapeDraw()DrawingDrawLine()DrawCircle()48设计原则:开设计原则:开--闭原则、封装可变性闭原则、封装可变性分析分析““不动众劳师不动众劳师””、不破坏天规就是、不破坏天规就是““闭闭””收仙有道就是收仙有道就是““开开””招安,就是玉帝的招安,就是玉帝的““开开--闭闭””原则:既让孙悟空原则:既让孙悟空满意,又不必更改天庭现有的秩序满意,又不必更改天庭现有的秩序51设计原则:开设计原则:开--闭原则、封装可变性闭原则、封装可变性设计模式对设计模式对““开开--闭闭””原则的支持原则的支持比如比如BridgeBridge桥梁模式:将抽象部分和实桥梁模式:将抽象部分和实现部分分别封装,可以分别独立变化现部分分别封装,可以分别独立变化V1DrawingDrawLine()DrawCircle()V2DrawingDrawLine()DrawCircle()RectangleDraw()CircleDraw()ShapeDraw()DrawingDrawLine()DrawCircle()52设计原则:开设计原则:开--闭原则、封装可变性闭原则、封装可变性对对““开开--闭闭””原则支持的不好的例子原则支持的不好的例子java.util.Calendarjava.util.CalendarCalendarGregorianCalendarLunaCalendarjava提供的描述历法的抽象类描述公历的子类我们希望再派生出一个子类,用于描述阴历55Strategy(Strategy(策略策略))模式模式桥梁模式桥梁模式使得两个变化点的独立使得两个变化点的独立56Strategy(Strategy(策略策略))模式模式单独看飞的行为的实现单独看飞的行为的实现策略模式:封装了一系列算法,使得它策略模式:封装了一系列算法,使得它们可以相互替换们可以相互替换效果:算法可以独立变化效果:算法可以独立变化57Strategy(Strategy(策略策略))::定义所有支持的算法的公共接口定义所有支持的算法的公共接口ConcreteStrategyConcreteStrategy((具体策略具体策略))::实现具体算法实现具体算法Context(Context(上下文上下文))::用一个用一个ConcreteStrategyConcreteStrategy对象来配置对象来配置维护一个对维护一个对StrategyStrategy对象的引用对象的引用可定义一个接口来让可定义一个接口来让StrategyStrategy访问它的数据访问它的数据62Adapter(Adapter(适配器适配器))模式模式新老代码接口不一致新老代码接口不一致63Adapter(Adapter(适配器适配器))模式模式疑问疑问把老代码修改一下不就可以了么?如下:把老代码修改一下不就可以了么?如下:65Adapter(Adapter(适配器适配器))模式模式应用应用((对象对象))适配器模式实现接口转换适配器模式实现接口转换67Adapter(Adapter(适配器适配器))模式模式叫叫呷呷叫呷呷叫鸟叫()飞()鸭子呷呷叫()短距离飞()鸭子适配器鸭子叫()飞()68Adapter(Adapter(适配器适配器))模式模式理解理解22:重新包装,改变接口:重新包装,改变接口鸟叫()飞()鸭子呷呷叫()短距离飞()69Adapter(Adapter(适配器适配器))模式模式类适配器类适配器70Adapter(Adapter(适配器适配器))模式模式结构结构对象对象AdapterAdapter71Adapter(Adapter(适配器适配器))模式模式结构结构类类AdapterAdapter73Adapter(Adapter(适配器适配器))模式模式应用举例应用举例11我们打算编写一个画图软件我们打算编写一个画图软件其中画圆形已经有了一个现成的类其中画圆形已经有了一个现成的类但是接口不同,不能直接使用但是接口不同,不能直接使用ShapeDraw()RectangleDraw()OldCircleDrawCircle()Shape*pShape=newOldCircle();pShape-Draw();???74Adapter(Adapter(适配器适配器))模式模式使用对象使用对象AdapterAdapterShapeDraw()RectangleDraw()OldCircleDrawCircle()CircleOldCircle*m_pOldCircleDraw()Circle::Draw(){m_pOldCircle-DrawCircle();}75Adapter(Adapter(适配器适配器))模式模式应用举例应用举例22缺省适配模式缺省适配模式————““鲁达剃度鲁达剃度””凡是和尚都应该如此:凡是和尚都应该如此:+()+()+()+()+()接口76Adapter(Adapter(适配器适配器))模式模式但是鲁智深并不是这样但是鲁智深并不是这样+()+()鲁智深::习武(){拳打镇关西();大闹五台山();倒拔垂杨柳();火烧瓦官寺();}鲁智深::习武(){拳打镇关西();大闹五台山();倒拔垂杨柳();火烧瓦官寺();}77Adapter(Adapter(适配器适配器))模式模式所以当初鲁达剃度时,众僧说:所以当初鲁达剃度时,众僧说:““这个人形容丑恶,相貌凶顽,不可剃度这个人形容丑恶,相貌凶顽,不可剃度””+()+()+()+()+()接口+()+()?78Adapter(Adapter(适配器适配器))模式模式但是长老却说:但是长老却说:““此人上应天星,心地刚直。虽然时下此人上应天星,心地刚直。虽然时下凶顽,命中驳杂,久后却得清静。证过凶顽,命中驳杂,久后却得清静。证过非凡,汝等皆不及他非凡,汝等皆不及他””+()+()+()+()+()接口+()+()+()+()+()+()+()79Adapter(Adapter(适配器适配器))模式模式““天星天星””就是缺省适配器就是缺省适配器当你不想当你不想//不能实现接口的所有方法时不能实现接口的所有方法时利用缺省适配器类,提供这些方法的缺省实现利用缺省适配器类,提供这些方法的缺省实现从这个类再派生出的子类就可以不去实现那些从这个类再派生出的子类就可以不去实现那些不想实现的方法了不想实现的方法了80设计原则:设计原则:里氏代换原则里氏代换原则例子例子11::““圆是不是椭圆?圆是不是椭圆?””在几何学里,圆是椭圆的一种特殊情况在几何学里,圆是椭圆的一种特殊情况因此,把椭圆看作父类,把圆作为子类因此,把椭圆看作父类,把圆作为子类81设计原则:设计原则:里氏代换原则里氏代换原则问题问题椭圆有长轴、短轴椭圆有长轴、短轴圆会完全继承下来圆会完全继承下来这些对于圆来说毫无意义这些对于圆来说毫无意义类似的:类似的:““

1 / 90
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功