《面向对象设计模式与设计原则.pdf》由会员分享,可在线阅读,更多相关《面向对象设计模式与设计原则.pdf(90页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
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设计原则:设计原则:设计原则:设计原则:里氏代换原则里氏代换原则里氏代换原则里氏代换原则问题问题问题问题椭圆有长轴、短轴椭圆有长轴、短轴椭圆有长轴、短轴椭圆有长轴、短轴圆会完全继承下来圆会完全继承下来圆会完全
26、继承下来圆会完全继承下来这些对于圆来说毫无意义这些对于圆来说毫无意义这些对于圆来说毫无意义这些对于圆来说毫无意义类似的:类似的:类似的:类似的:“正方形不是矩形正方形不是矩形正方形不是矩形正方形不是矩形”Circle circle;circle.GetMajorAxis();82设计原则:设计原则:设计原则:设计原则:里氏代换原则里氏代换原则里氏代换原则里氏代换原则例子例子例子例子2 2:“企鹅不是鸟的子类企鹅不是鸟的子类企鹅不是鸟的子类企鹅不是鸟的子类”凡是鸟都会飞凡是鸟都会飞凡是鸟都会飞凡是鸟都会飞但是企鹅不会但是企鹅不会但是企鹅不会但是企鹅不会83设计原则:设计原则:设计原则:设计原则:
27、里氏代换原则里氏代换原则里氏代换原则里氏代换原则例子例子例子例子3 3我们需要设计一个类我们需要设计一个类我们需要设计一个类我们需要设计一个类FileNameFileName来描述文来描述文来描述文来描述文件名,而文件名不就是一个特殊的字符件名,而文件名不就是一个特殊的字符件名,而文件名不就是一个特殊的字符件名,而文件名不就是一个特殊的字符串么?所以我们如此设计:串么?所以我们如此设计:串么?所以我们如此设计:串么?所以我们如此设计:FileNameRename()GetName()String88设计原则:设计原则:设计原则:设计原则:里氏代换原则里氏代换原则里氏代换原则里氏代换原则Java
28、Java语言对此类问题的防范语言对此类问题的防范语言对此类问题的防范语言对此类问题的防范它的它的它的它的StringString类是类是类是类是finalfinal的,不能继承的,不能继承的,不能继承的,不能继承正确的方法正确的方法正确的方法正确的方法使用使用使用使用AdapterAdapter模式模式模式模式StringFileNameaStringGetName()Rename()89设计原则:设计原则:设计原则:设计原则:里氏代换原则里氏代换原则里氏代换原则里氏代换原则JavaJava中的反例中的反例中的反例中的反例它的它的它的它的StackStack类是从类是从类是从类是从Vector
29、Vector类继承下来的类继承下来的类继承下来的类继承下来的“栈不就是施加了访问限制的数组么?栈不就是施加了访问限制的数组么?栈不就是施加了访问限制的数组么?栈不就是施加了访问限制的数组么?”所以所以所以所以“Stack IsStack Is-A VectorA Vector”java.util.Vectorjava.util.Stack91设计原则:设计原则:设计原则:设计原则:里氏代换原则里氏代换原则里氏代换原则里氏代换原则看看看看看看看看C+STLC+STL是怎么办的是怎么办的是怎么办的是怎么办的STLSTL中的中的中的中的stackstack其实是一个其实是一个其实是一个其实是一个Ad
30、apterAdaptertemplate class T,class Cont=deque class stack public:void push(const value_type&x)c.push_back(x);void pop()c.pop_back(x);protected:Cont c;92Factory Method(Factory Method(工厂方法工厂方法工厂方法工厂方法)模式模式模式模式例子:例子:例子:例子:“去快餐厅吃饭去快餐厅吃饭去快餐厅吃饭去快餐厅吃饭”93void BuyFood(string 餐馆餐馆,string 食品食品)if(餐馆餐馆=KFC)if(食
31、品食品=Chicken)hamburger=new KFCChickenHamburger;else if(food=Fish)hamburger=new KFCFishHamburger;else if(restaurant=McDonald)if(food=Chicken)hamburger=new McDonaldChickenHamburger;else if(food=Fish)hamburger=new McDonaldFishHamburger;94Factory Method(Factory Method(工厂方法工厂方法工厂方法工厂方法)模式模式模式模式增加一种新的食物呢?增
32、加一种新的食物呢?增加一种新的食物呢?增加一种新的食物呢?95void BuyFood(string 餐馆餐馆,string 食品食品)if(餐馆餐馆=KFC)if(食品食品=Chicken)hamburger=new KFCChickenHamburger;else if(food=Fish)hamburger=new KFCFishHamburger;.Factory Method(Factory Method(工厂方法工厂方法工厂方法工厂方法)模式模式模式模式传统设计的缺点传统设计的缺点传统设计的缺点传统设计的缺点依赖具体依赖具体依赖具体依赖具体97设计原则:依赖倒置原则设计原则:依赖倒
33、置原则设计原则:依赖倒置原则设计原则:依赖倒置原则为什么说为什么说为什么说为什么说“倒置倒置倒置倒置”传统的设计是抽象层依赖具体层传统的设计是抽象层依赖具体层传统的设计是抽象层依赖具体层传统的设计是抽象层依赖具体层传统的重用,侧重于具体层次的模块,比传统的重用,侧重于具体层次的模块,比传统的重用,侧重于具体层次的模块,比传统的重用,侧重于具体层次的模块,比如算法、数据结构、函数库如算法、数据结构、函数库如算法、数据结构、函数库如算法、数据结构、函数库因此软件的高层模块依赖低层模块因此软件的高层模块依赖低层模块因此软件的高层模块依赖低层模块因此软件的高层模块依赖低层模块传传传传统统统统的的的的依
34、依依依赖赖赖赖方方方方向向向向99设计原则:依赖倒置原则设计原则:依赖倒置原则设计原则:依赖倒置原则设计原则:依赖倒置原则依赖具体的缺点依赖具体的缺点依赖具体的缺点依赖具体的缺点100设计原则:依赖倒置原则设计原则:依赖倒置原则设计原则:依赖倒置原则设计原则:依赖倒置原则依赖抽象依赖抽象依赖抽象依赖抽象抽象一般不会变动抽象一般不会变动抽象一般不会变动抽象一般不会变动这样代码不会受易变的具体层影响这样代码不会受易变的具体层影响这样代码不会受易变的具体层影响这样代码不会受易变的具体层影响103Factory Method(Factory Method(工厂方法工厂方法工厂方法工厂方法)模式模式模式
35、模式“女娲抟土造人女娲抟土造人女娲抟土造人女娲抟土造人”风俗通风俗通风俗通风俗通:“俗说天开地辟,未有人民。女俗说天开地辟,未有人民。女俗说天开地辟,未有人民。女俗说天开地辟,未有人民。女娲抟黄土为人。娲抟黄土为人。娲抟黄土为人。娲抟黄土为人。”人人吃 饭吃 饭()说 话说 话()睡 觉睡 觉()男 人男 人吃 饭吃 饭()说 话说 话()睡 觉睡 觉()女 娲女 娲抟 土 造 人抟 土 造 人()女 人女 人吃 饭吃 饭()说 话说 话()睡 觉睡 觉()104Factory Method(Factory Method(工厂方法工厂方法工厂方法工厂方法)模式模式模式模式简单工厂:简单工厂:简
36、单工厂:简单工厂:根据传入的参数,决定创建根据传入的参数,决定创建根据传入的参数,决定创建根据传入的参数,决定创建哪一个产品类对象哪一个产品类对象哪一个产品类对象哪一个产品类对象Human*NvWa:CreateHuman(string name)if(name=“ZhangSan)return new ZhangSan;else if(name=“LiSi)return new LiSi;else if(name=“WangErMaZi)return new WangErMaZi;106Factory Method(Factory Method(工厂方法工厂方法工厂方法工厂方法)模式模式模式
37、模式“女娲举绳造人女娲举绳造人女娲举绳造人女娲举绳造人”“女娲抟土为人,剧务,力不暇供,乃女娲抟土为人,剧务,力不暇供,乃女娲抟土为人,剧务,力不暇供,乃女娲抟土为人,剧务,力不暇供,乃引绳于桓泥中,举以为人。引绳于桓泥中,举以为人。引绳于桓泥中,举以为人。引绳于桓泥中,举以为人。”人人吃 饭吃 饭()说 话说 话()睡 觉睡 觉()女 娲 神 绳女 娲 神 绳举 绳 造 人举 绳 造 人()阴 绳阴 绳举 绳 造 人举 绳 造 人()女 人女 人吃 饭吃 饭()说 话说 话()睡 觉睡 觉()阳 绳阳 绳举 绳 造 人举 绳 造 人()男 人男 人吃 饭吃 饭()说 话说 话()睡 觉睡 觉
38、()108Factory Method(Factory Method(工厂方法工厂方法工厂方法工厂方法)模式模式模式模式结构结构结构结构110Factory Method(Factory Method(工厂方法工厂方法工厂方法工厂方法)模式模式模式模式工厂方法应用到工厂方法应用到工厂方法应用到工厂方法应用到“快餐店快餐店快餐店快餐店”问题问题问题问题汉 堡 包汉 堡 包快 餐 店快 餐 店创 建 汉 堡 包创 建 汉 堡 包()麦 辣 鸡 腿 堡麦 辣 鸡 腿 堡麦 当 劳麦 当 劳创 建 汉 堡 包创 建 汉 堡 包()麦 香 鱼 堡麦 香 鱼 堡烤 鸡 腿 堡烤 鸡 腿 堡肯 德 基肯 德
39、 基创 建 汉 堡 包创 建 汉 堡 包()鳕 鱼 堡鳕 鱼 堡111FaFa ade(ade(门面门面门面门面)模式模式模式模式例例例例1 1:传统的医院:传统的医院:传统的医院:传统的医院:病人需要直接跟各个部门打交道病人需要直接跟各个部门打交道病人需要直接跟各个部门打交道病人需要直接跟各个部门打交道门诊门诊门诊门诊挂号挂号挂号挂号划价划价划价划价化验化验化验化验取药取药取药取药112FaFa ade(ade(门面门面门面门面)模式模式模式模式人性化的医院人性化的医院人性化的医院人性化的医院接待员代替病人进行挂号、划价等接待员代替病人进行挂号、划价等接待员代替病人进行挂号、划价等接待员代替
40、病人进行挂号、划价等病人只需要和接待员打交道病人只需要和接待员打交道病人只需要和接待员打交道病人只需要和接待员打交道门诊门诊门诊门诊挂号挂号挂号挂号划价划价划价划价取药取药取药取药接待员接待员接待员接待员医院的门面医院的门面(Facade)115FaFa ade(ade(门面门面门面门面)模式模式模式模式家庭影院系统:家庭影院系统:家庭影院系统:家庭影院系统:116FaFa ade(ade(门面门面门面门面)模式模式模式模式用用用用OOOO语言描述看电影的辛苦过程语言描述看电影的辛苦过程语言描述看电影的辛苦过程语言描述看电影的辛苦过程curtain.close();lights.setligh
41、t(5);tv.on();dvd.on();dvd.insertdisk(disk);dvd.play();amplifier.on();amplifier.setvolumn(5);120FaFa ade(ade(门面门面门面门面)模式模式模式模式用一个门面对象简化所有细节用一个门面对象简化所有细节用一个门面对象简化所有细节用一个门面对象简化所有细节122FaFa ade(ade(门面门面门面门面)模式模式模式模式举例:保安系统举例:保安系统举例:保安系统举例:保安系统CameraLightSensorAlarmClientcamera1:Cameracamera2:Cameralight1
42、:Lightlight2:Lightlight3:Lightsensor:Sensoralarm:Alarm123FaFa ade(ade(门面门面门面门面)模式模式模式模式使用门面模式使用门面模式使用门面模式使用门面模式CameraLightSensorAlarmSecurityFacadecamera1:Cameracamera2:Cameralight1:Lightlight2:Lightlight3:Lightsensor:Sensoralarm:AlarmTurnOn()TurnOff()Client128设计原则:接口隔离原则设计原则:接口隔离原则设计原则:接口隔离原则设计原则:接
43、口隔离原则例子:全文搜索引擎例子:全文搜索引擎例子:全文搜索引擎例子:全文搜索引擎搜索搜索搜索搜索处理搜索结果处理搜索结果处理搜索结果处理搜索结果生成索引生成索引生成索引生成索引129设计原则:接口隔离原则设计原则:接口隔离原则设计原则:接口隔离原则设计原则:接口隔离原则接口分割:接口分割:接口分割:接口分割:132Command(Command(命令命令命令命令)模式模式模式模式传统的想法:传统的想法:传统的想法:传统的想法:133Command(Command(命令命令命令命令)模式模式模式模式用户要求:按钮可以自定义用户要求:按钮可以自定义用户要求:按钮可以自定义用户要求:按钮可以自定义
44、void RemoteControl:Button1()tv-On();135Command(Command(命令命令命令命令)模式模式模式模式结构结构结构结构138?汉堡汉堡汉堡汉堡?可乐可乐可乐可乐?薯条薯条薯条薯条点菜单点菜单顾客顾客顾客顾客知道自己想要知道自己想要知道自己想要知道自己想要什么,并填写什么,并填写什么,并填写什么,并填写菜单菜单菜单菜单服务员服务员服务员服务员接过接过接过接过菜单菜单菜单菜单交给交给交给交给厨师厨师厨师厨师厨师厨师厨师厨师根据根据根据根据菜单菜单菜单菜单上的上的上的上的要求把饭菜做好要求把饭菜做好要求把饭菜做好要求把饭菜做好例例例例2 2:餐厅的工作流程:
45、餐厅的工作流程:餐厅的工作流程:餐厅的工作流程菜单菜单菜单菜单记录了记录了记录了记录了顾客顾客顾客顾客的要求的要求的要求的要求139Command(Command(命令命令命令命令)模式模式模式模式结构结构结构结构141Command(Command(命令命令命令命令)模式模式模式模式运作过程:运作过程:运作过程:运作过程:142命令命令命令命令(Command)(Command):声明执行操作的接口:声明执行操作的接口:声明执行操作的接口:声明执行操作的接口具体命令具体命令具体命令具体命令(Concrete Command)(Concrete Command):将一个接收者对象绑定:将一个接
46、收者对象绑定:将一个接收者对象绑定:将一个接收者对象绑定于一个动作;调用接收者相应的操作,以实现于一个动作;调用接收者相应的操作,以实现于一个动作;调用接收者相应的操作,以实现于一个动作;调用接收者相应的操作,以实现 Execute()Execute()客户客户客户客户(Client)(Client):创建具体命令对象并设定它的接收者:创建具体命令对象并设定它的接收者:创建具体命令对象并设定它的接收者:创建具体命令对象并设定它的接收者调用者调用者调用者调用者(Invoker)(Invoker):要求该命令执行这个请求:要求该命令执行这个请求:要求该命令执行这个请求:要求该命令执行这个请求接收者
47、接收者接收者接收者(Receiver)(Receiver):知道如何实施与执行一个请求相关的:知道如何实施与执行一个请求相关的:知道如何实施与执行一个请求相关的:知道如何实施与执行一个请求相关的操作,任何类都可以作为一个接收者操作,任何类都可以作为一个接收者操作,任何类都可以作为一个接收者操作,任何类都可以作为一个接收者144Command(Command(命令命令命令命令)模式模式模式模式命令模式应用在遥控器上:命令模式应用在遥控器上:命令模式应用在遥控器上:命令模式应用在遥控器上:147Command(Command(命令命令命令命令)模式模式模式模式结构:结构:结构:结构:150Comm
48、and(Command(命令命令命令命令)模式模式模式模式结构结构结构结构151Command(Command(命令命令命令命令)模式模式模式模式应用举例应用举例应用举例应用举例3 3:图形界面:图形界面:图形界面:图形界面CommandExecute()MenuItemClicked()OpenCommandExecute()AskUser()MenuAdd()filename=AskUser();doc=new Document(filename);application-Add(doc);doc-Open();document-Paste();ApplicationAdd()Docume
49、ntOpen()Close()Cut()Copy()Paste()PasteCommandExecute()154好莱坞法则好莱坞法则好莱坞法则好莱坞法则class Buttonpublic:Button():action(0)void setAction(void(*act)()action=act;void onClick()(*action)();private:void(*action)();156Template Method Template Method 模板方法模板方法模板方法模板方法157应用举例:应用举例:应用举例:应用举例:Java AppletJava Appletpu
50、blic class MyApplet extends AppletString message;public void init()message=Hello;repaint();public void start()message=Now Im starting up;repaint();public void stop()message=Im being stopped;repaint();public void destroy()public void paint(Graphics g)g.drawString(message,5,15);159Observer(Observer(观察