面向对象设计模式与设计原则.pdf
《面向对象设计模式与设计原则.pdf》由会员分享,可在线阅读,更多相关《面向对象设计模式与设计原则.pdf(90页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、9模式的分类模式的分类模式的分类模式的分类(gofgof提出的提出的提出的提出的2323个个个个)行为型行为型行为型行为型Chain of ResponsibilityChain of ResponsibilityCommandCommandIteratorIteratorMediatorMediatorMementoMementoObserverObserverStateStateStrategyStrategyVisitor Visitor Adapter(Adapter(对象对象对象对象)BridgeBridgeCompositeCompositeDecoratorDecoratorFa
2、cadeFacadeFlyweightFlyweightProxy Proxy Abstract FactoryAbstract FactoryBuilderBuilderPrototypePrototypeSingleton Singleton 对对对对象象象象InterpreterInterpreterTemplate MethodTemplate MethodAdapter(Adapter(类类类类)Factory MethodFactory Method类类类类结构型结构型结构型结构型创建型创建型创建型创建型11Bridge(Bridge(桥梁桥梁桥梁桥梁)模式模式模式模式最初的设计最
3、初的设计最初的设计最初的设计12Bridge(Bridge(桥梁桥梁桥梁桥梁)模式模式模式模式需求变化:鸟类要会飞需求变化:鸟类要会飞需求变化:鸟类要会飞需求变化:鸟类要会飞13Bridge(Bridge(桥梁桥梁桥梁桥梁)模式模式模式模式如果增加一种鸟类如果增加一种鸟类如果增加一种鸟类如果增加一种鸟类“企鹅企鹅企鹅企鹅”呢?呢?呢?呢?14Bridge(Bridge(桥梁桥梁桥梁桥梁)模式模式模式模式改进方法:对改进方法:对改进方法:对改进方法:对“飞飞飞飞”使用多态使用多态使用多态使用多态15Bridge(Bridge(桥梁桥梁桥梁桥梁)模式模式模式模式改进方法:再次使用继承改进方法:再次
4、使用继承改进方法:再次使用继承改进方法:再次使用继承16Bridge(Bridge(桥梁桥梁桥梁桥梁)模式模式模式模式如果增加如果增加如果增加如果增加“游泳游泳游泳游泳”行为呢?行为呢?行为呢?行为呢?18设计原则:组合优先设计原则:组合优先设计原则:组合优先设计原则:组合优先继承复用的优点继承复用的优点继承复用的优点继承复用的优点可以很容易的修改或扩展父类的实现可以很容易的修改或扩展父类的实现可以很容易的修改或扩展父类的实现可以很容易的修改或扩展父类的实现22设计原则:组合优先设计原则:组合优先设计原则:组合优先设计原则:组合优先如果使用继承来描述:如果使用继承来描述:如果使用继承来描述:如
5、果使用继承来描述:一旦增加新的汽车种类或用途,都需要一旦增加新的汽车种类或用途,都需要一旦增加新的汽车种类或用途,都需要一旦增加新的汽车种类或用途,都需要大量改动原有代码大量改动原有代码大量改动原有代码大量改动原有代码23设计原则:组合优先设计原则:组合优先设计原则:组合优先设计原则:组合优先使用使用使用使用“组合组合组合组合”思路考虑问题思路考虑问题思路考虑问题思路考虑问题“汽车汽车汽车汽车”拥有某种或某些拥有某种或某些拥有某种或某些拥有某种或某些“用途用途用途用途”“汽车汽车汽车汽车”和和和和“用途用途用途用途”独立变化,互不影响独立变化,互不影响独立变化,互不影响独立变化,互不影响24设
6、计原则:组合优先设计原则:组合优先设计原则:组合优先设计原则:组合优先区分区分区分区分“Is Is-A A”与与与与“HasHas-A A”有一个系统需要描述经理、雇员和学生有一个系统需要描述经理、雇员和学生有一个系统需要描述经理、雇员和学生有一个系统需要描述经理、雇员和学生它们都是人,所以:它们都是人,所以:它们都是人,所以:它们都是人,所以:25设计原则:组合优先设计原则:组合优先设计原则:组合优先设计原则:组合优先问题问题问题问题有些人既是经理,又是学生,比如某位有些人既是经理,又是学生,比如某位有些人既是经理,又是学生,比如某位有些人既是经理,又是学生,比如某位在读在读在读在读MBAM
7、BA的老总的老总的老总的老总26设计原则:组合优先设计原则:组合优先设计原则:组合优先设计原则:组合优先换一个角度看问题换一个角度看问题换一个角度看问题换一个角度看问题雇员、经理、学生其实都是角色的一种雇员、经理、学生其实都是角色的一种雇员、经理、学生其实都是角色的一种雇员、经理、学生其实都是角色的一种人拥有角色人拥有角色人拥有角色人拥有角色28Bridge(Bridge(桥梁桥梁桥梁桥梁)模式模式模式模式“发现变化点发现变化点发现变化点发现变化点”29Bridge(Bridge(桥梁桥梁桥梁桥梁)模式模式模式模式“封装变化点封装变化点封装变化点封装变化点”变化点变化点变化点变化点1 1:小鸟
8、一家:小鸟一家:小鸟一家:小鸟一家30Bridge(Bridge(桥梁桥梁桥梁桥梁)模式模式模式模式“封装变化点封装变化点封装变化点封装变化点”变化点变化点变化点变化点2 2:鸟类的行为:鸟类的行为:鸟类的行为:鸟类的行为飞飞飞飞31Bridge(Bridge(桥梁桥梁桥梁桥梁)模式模式模式模式“封装变化点封装变化点封装变化点封装变化点”变化点变化点变化点变化点2 2:鸟类的行为:鸟类的行为:鸟类的行为:鸟类的行为游泳游泳游泳游泳33鸟儿拥有飞、游泳的行为鸟儿拥有飞、游泳的行为鸟儿拥有飞、游泳的行为鸟儿拥有飞、游泳的行为35Bridge(Bridge(桥梁桥梁桥梁桥梁)模式模式模式模式37Br
9、idge(Bridge(桥梁桥梁桥梁桥梁)模式模式模式模式结构结构结构结构39Bridge(Bridge(桥梁桥梁桥梁桥梁)模式模式模式模式应用举例应用举例应用举例应用举例1 1:“小朋友画画小朋友画画小朋友画画小朋友画画”使用蜡笔使用蜡笔使用蜡笔使用蜡笔需要大中小三种型号需要大中小三种型号需要大中小三种型号需要大中小三种型号每种型号各有每种型号各有每种型号各有每种型号各有1212种颜色种颜色种颜色种颜色共共共共3636支支支支40Bridge(Bridge(桥梁桥梁桥梁桥梁)模式模式模式模式使用毛笔:使用毛笔:使用毛笔:使用毛笔:大、中、小大、中、小大、中、小大、中、小3 3支毛笔支毛笔支毛
10、笔支毛笔1212种颜料种颜料种颜料种颜料42Bridge(Bridge(桥梁桥梁桥梁桥梁)模式模式模式模式应用举例应用举例应用举例应用举例2 2有一个有一个有一个有一个CADCAD软件,可以画多种图形软件,可以画多种图形软件,可以画多种图形软件,可以画多种图形同时支持多套绘图算法同时支持多套绘图算法同时支持多套绘图算法同时支持多套绘图算法传统的设计传统的设计传统的设计传统的设计ShapeDraw()RectangleDraw()CircleDraw()V1RectangleV2RectangleV1CircleV2Circle43Bridge(Bridge(桥梁桥梁桥梁桥梁)模式模式模式模式应
11、用应用应用应用BridgeBridge模式模式模式模式V1DrawingDrawLine()DrawCircle()V2DrawingDrawLine()DrawCircle()RectangleDraw()CircleDraw()ShapeDraw()DrawingDrawLine()DrawCircle()48设计原则:开设计原则:开设计原则:开设计原则:开-闭原则、封装可变性闭原则、封装可变性闭原则、封装可变性闭原则、封装可变性分析分析分析分析“不动众劳师不动众劳师不动众劳师不动众劳师”、不破坏天规就是、不破坏天规就是、不破坏天规就是、不破坏天规就是“闭闭闭闭”收仙有道就是收仙有道就是收
12、仙有道就是收仙有道就是“开开开开”招安,就是玉帝的招安,就是玉帝的招安,就是玉帝的招安,就是玉帝的“开开开开-闭闭闭闭”原则:既让孙悟空原则:既让孙悟空原则:既让孙悟空原则:既让孙悟空满意,又不必更改天庭现有的秩序满意,又不必更改天庭现有的秩序满意,又不必更改天庭现有的秩序满意,又不必更改天庭现有的秩序51设计原则:开设计原则:开设计原则:开设计原则:开-闭原则、封装可变性闭原则、封装可变性闭原则、封装可变性闭原则、封装可变性设计模式对设计模式对设计模式对设计模式对“开开开开-闭闭闭闭”原则的支持原则的支持原则的支持原则的支持比如比如比如比如BridgeBridge桥梁模式:将抽象部分和实桥梁
13、模式:将抽象部分和实桥梁模式:将抽象部分和实桥梁模式:将抽象部分和实现部分分别封装,可以分别独立变化现部分分别封装,可以分别独立变化现部分分别封装,可以分别独立变化现部分分别封装,可以分别独立变化V1DrawingDrawLine()DrawCircle()V2DrawingDrawLine()DrawCircle()RectangleDraw()CircleDraw()ShapeDraw()DrawingDrawLine()DrawCircle()52设计原则:开设计原则:开设计原则:开设计原则:开-闭原则、封装可变性闭原则、封装可变性闭原则、封装可变性闭原则、封装可变性对对对对“开开开开-
14、闭闭闭闭”原则支持的不好的例子原则支持的不好的例子原则支持的不好的例子原则支持的不好的例子java.util.Calendarjava.util.CalendarCalendarGregorianCalendarLunaCalendarjava提供的描述历法的抽象类提供的描述历法的抽象类描述公历的子类描述公历的子类我们希望再派生出一个子类,用于描述阴历我们希望再派生出一个子类,用于描述阴历55Strategy(Strategy(策略策略策略策略)模式模式模式模式桥梁模式桥梁模式桥梁模式桥梁模式使得两个变化点的独立使得两个变化点的独立使得两个变化点的独立使得两个变化点的独立56Strategy(
15、Strategy(策略策略策略策略)模式模式模式模式单独看飞的行为的实现单独看飞的行为的实现单独看飞的行为的实现单独看飞的行为的实现策略模式:封装了一系列算法,使得它策略模式:封装了一系列算法,使得它策略模式:封装了一系列算法,使得它策略模式:封装了一系列算法,使得它们可以相互替换们可以相互替换们可以相互替换们可以相互替换效果:算法可以独立变化效果:算法可以独立变化效果:算法可以独立变化效果:算法可以独立变化57Strategy(Strategy(策略策略策略策略):定义所有支持的算法的公共接口定义所有支持的算法的公共接口定义所有支持的算法的公共接口定义所有支持的算法的公共接口Concrete
16、StrategyConcreteStrategy(具体策略具体策略具体策略具体策略):实现具体算法实现具体算法实现具体算法实现具体算法Context(Context(上下文上下文上下文上下文):用一个用一个用一个用一个ConcreteStrategyConcreteStrategy对象来配置对象来配置对象来配置对象来配置维护一个对维护一个对维护一个对维护一个对StrategyStrategy对象的引用对象的引用对象的引用对象的引用可定义一个接口来让可定义一个接口来让可定义一个接口来让可定义一个接口来让StrategyStrategy访问它的数据访问它的数据访问它的数据访问它的数据62Adapt
17、er(Adapter(适配器适配器适配器适配器)模式模式模式模式新老代码接口不一致新老代码接口不一致新老代码接口不一致新老代码接口不一致63Adapter(Adapter(适配器适配器适配器适配器)模式模式模式模式疑问疑问疑问疑问把老代码修改一下不就可以了么?如下:把老代码修改一下不就可以了么?如下:把老代码修改一下不就可以了么?如下:把老代码修改一下不就可以了么?如下:65Adapter(Adapter(适配器适配器适配器适配器)模式模式模式模式应用应用应用应用(对象对象对象对象)适配器模式实现接口转换适配器模式实现接口转换适配器模式实现接口转换适配器模式实现接口转换67Adapter(Ad
18、apter(适配器适配器适配器适配器)模式模式模式模式叫叫叫叫呷呷叫呷呷叫呷呷叫呷呷叫鸟鸟叫叫()飞飞()鸭子鸭子呷呷叫呷呷叫()短距离飞短距离飞()鸭子适配器鸭子适配器鸭子鸭子叫叫()飞飞()68Adapter(Adapter(适配器适配器适配器适配器)模式模式模式模式理解理解理解理解2 2:重新包装,改变接口:重新包装,改变接口:重新包装,改变接口:重新包装,改变接口鸟鸟叫叫()飞飞()鸭子鸭子呷呷叫呷呷叫()短距离飞短距离飞()69Adapter(Adapter(适配器适配器适配器适配器)模式模式模式模式类适配器类适配器类适配器类适配器70Adapter(Adapter(适配器适配器适配
19、器适配器)模式模式模式模式结构结构结构结构对象对象对象对象AdapterAdapter71Adapter(Adapter(适配器适配器适配器适配器)模式模式模式模式结构结构结构结构类类类类AdapterAdapter73Adapter(Adapter(适配器适配器适配器适配器)模式模式模式模式应用举例应用举例应用举例应用举例1 1我们打算编写一个画图软件我们打算编写一个画图软件我们打算编写一个画图软件我们打算编写一个画图软件其中画圆形已经有了一个现成的类其中画圆形已经有了一个现成的类其中画圆形已经有了一个现成的类其中画圆形已经有了一个现成的类但是接口不同,不能直接使用但是接口不同,不能直接使用
20、但是接口不同,不能直接使用但是接口不同,不能直接使用ShapeDraw()RectangleDraw()OldCircleDrawCircle()Shape*pShape=new OldCircle();pShape-Draw();?74Adapter(Adapter(适配器适配器适配器适配器)模式模式模式模式使用对象使用对象使用对象使用对象AdapterAdapterShapeDraw()RectangleDraw()OldCircleDrawCircle()CircleOldCircle*m_pOldCircleDraw()Circle:Draw()m_pOldCircle-DrawCir
21、cle();75Adapter(Adapter(适配器适配器适配器适配器)模式模式模式模式应用举例应用举例应用举例应用举例2 2缺省适配模式缺省适配模式缺省适配模式缺省适配模式“鲁达剃度鲁达剃度鲁达剃度鲁达剃度”凡是和尚都应该如此:凡是和尚都应该如此:凡是和尚都应该如此:凡是和尚都应该如此:+()+()+()+()+()76Adapter(Adapter(适配器适配器适配器适配器)模式模式模式模式但是鲁智深并不是这样但是鲁智深并不是这样但是鲁智深并不是这样但是鲁智深并不是这样+()+()鲁智深鲁智深:习武习武()拳打镇关西拳打镇关西();大闹五台山大闹五台山();倒拔垂杨柳倒拔垂杨柳();火烧
22、瓦官寺火烧瓦官寺();鲁智深鲁智深:习武习武()拳打镇关西拳打镇关西();大闹五台山大闹五台山();倒拔垂杨柳倒拔垂杨柳();火烧瓦官寺火烧瓦官寺();77Adapter(Adapter(适配器适配器适配器适配器)模式模式模式模式所以当初鲁达剃度时,众僧说:所以当初鲁达剃度时,众僧说:所以当初鲁达剃度时,众僧说:所以当初鲁达剃度时,众僧说:“这个人形容丑恶,相貌凶顽,不可剃度这个人形容丑恶,相貌凶顽,不可剃度这个人形容丑恶,相貌凶顽,不可剃度这个人形容丑恶,相貌凶顽,不可剃度”+()+()+()+()+()+()+()?78Adapter(Adapter(适配器适配器适配器适配器)模式模式模式
23、模式但是长老却说:但是长老却说:但是长老却说:但是长老却说:“此人上应天星,心地刚直。虽然时下此人上应天星,心地刚直。虽然时下此人上应天星,心地刚直。虽然时下此人上应天星,心地刚直。虽然时下凶顽,命中驳杂,久后却得清静。证过凶顽,命中驳杂,久后却得清静。证过凶顽,命中驳杂,久后却得清静。证过凶顽,命中驳杂,久后却得清静。证过非凡,汝等皆不及他非凡,汝等皆不及他非凡,汝等皆不及他非凡,汝等皆不及他”+()+()+()+()+()+()+()+()+()+()+()+()79Adapter(Adapter(适配器适配器适配器适配器)模式模式模式模式“天星天星天星天星”就是缺省适配器就是缺省适配器就
24、是缺省适配器就是缺省适配器当你不想当你不想当你不想当你不想/不能实现接口的所有方法时不能实现接口的所有方法时不能实现接口的所有方法时不能实现接口的所有方法时利用缺省适配器类,提供这些方法的缺省实现利用缺省适配器类,提供这些方法的缺省实现利用缺省适配器类,提供这些方法的缺省实现利用缺省适配器类,提供这些方法的缺省实现从这个类再派生出的子类就可以不去实现那些从这个类再派生出的子类就可以不去实现那些从这个类再派生出的子类就可以不去实现那些从这个类再派生出的子类就可以不去实现那些不想实现的方法了不想实现的方法了不想实现的方法了不想实现的方法了80设计原则:设计原则:设计原则:设计原则:里氏代换原则里氏
25、代换原则里氏代换原则里氏代换原则例子例子例子例子1 1:“圆是不是椭圆?圆是不是椭圆?圆是不是椭圆?圆是不是椭圆?”在几何学里,圆是椭圆的一种特殊情况在几何学里,圆是椭圆的一种特殊情况在几何学里,圆是椭圆的一种特殊情况在几何学里,圆是椭圆的一种特殊情况因此,把椭圆看作父类,把圆作为子类因此,把椭圆看作父类,把圆作为子类因此,把椭圆看作父类,把圆作为子类因此,把椭圆看作父类,把圆作为子类81设计原则:设计原则:设计原则:设计原则:里氏代换原则里氏代换原则里氏代换原则里氏代换原则问题问题问题问题椭圆有长轴、短轴椭圆有长轴、短轴椭圆有长轴、短轴椭圆有长轴、短轴圆会完全继承下来圆会完全继承下来圆会完全
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 设计 模式 原则
限制150内