您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > UML设计模式 8 设计模式(2)--Strategy, Bridge模式
权巍主要内容8.1Strategy模式8.2Bridge模式8.3“开-闭”原则8.4组合/聚合复用原则2UML和设计模式8.1Strategy(策略)模式UML和设计模式3网上商城购物车系统的例子计算购物车中所有商品的总金额、运费。而商城经常促销,不同的商品有不同的折扣。怎样计算?用if、switch等条件语句,根据不同情况用不同算法计算;继承,在子类里面实现不同的行为;8.1.1什么是Strategy模式Strategy模式又称Policy模式,它定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。该模式使算法可以独立于使用它的客户而变化。UML和设计模式48.1.2策略模式中的角色环境(Context)持有一个Strategy类的引用。可定义一个接口让Strategy访问它的数据。抽象策略(Strategy)给出所有的具体策略类所需的接口,通常由一个接口或抽象类实现。具体策略(ContreteStrategy)包装了相关的算法或行为,实现Strategy接口的某个具体类。UML和设计模式5UML和设计模式6Context示意代码:publicclassContext{privateStrategystrategy;publicvoidcontextInterface(){strategy.strategyInterface();}}UML和设计模式7Strategy示意代码:abstractpublicclassStrategy{publicabstractvoidstrategyInterface();}ContreteStrategy示意代码:publicclassConcreteStrategyextendsStrategy{publicvoidstrategyInterface(){//算法实现代码}}8.1.3策略模式的代码示例某网上商城举行促销活动:图书每本折扣1元,服装类8折,家居类9折,护肤品没折扣。顾客结算时,计算购物车中所有商品的总金额。UML和设计模式8例子的策略模式示意代码DiscountStrategy代码:NoDiscountStrategy代码:FlatRateStrategy代码:PercentageStrategy代码:Context代码:Client代码:UML和设计模式9练习要设计一个系统,对输入的数据实现排序,系统提供几种排序方法。系统运行时根据用户选择的排序方法对数据进行排序。(另外,可能会常常增加新的排序算法、或删除某个算法)UML和设计模式108.2Bridge(桥接)模式UML和设计模式11开发游戏软件的例子需要开发一款太空大战游戏,该游戏可安装在PC或手机上,不同平台上游戏的功能完全相同,并且有多种型号的太空船可供用户选择。存在的问题在PC和手机上的图形绘制、声效、游戏操作等方面的实现不同。经常需要增加新型的太空船。实现方案一:UML和设计模式12PCSpaceShipMobileSpaceShipSpaceShipT30SpaceShipT20SpaceShipT50SpaceShipPCT20PCT30PCT50MobileT20MobileT30MobileT50UML和设计模式13示意代码//抽象飞船基类publicabstractclassSpaceShip{publicabstractshot();publicabstractrun();//...}//各种型号飞船publicabstractclassSpaceShipT20extendsSpaceShip{...}publicabstractclassSpaceShipT30extendsSpaceShip{...}publicabstractclassSpaceShipT50extendsSpaceShip{...}//不同平台飞船publicclassPCSpaceShipextendsSpaceShip{...}publicclassMobileSpaceShipextendsSpaceShip{...}8.2.1什么是Bridge模式Bridge模式将抽象和实现分离,使它们都可以独立的变化。Bridge模式是一种结构型模式,使用对象间的组合关系解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。一般应用在“两个非常强的变化维度”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈,即当两个变化不会导致纵横交错的结果,并不一定要使用本模式。UML和设计模式14UML和设计模式15Bridge模式的类图Bridge模式中的角色抽象化(Abstraction):抽象化给出的定义,并保存一个对实现化对象的引用。修正抽象化(RefinedAbstraction):扩展抽象化角色,改变和修正父类对抽象化的定义。实现化(Implementor):给出实现化角色的接口。实现化角色只给出底层操作,而抽象化角色应只给出基于底层操作的更高一层的操作。具体实现化(ConcreteImplementor):给出实现化角色接口的具体实现。UML和设计模式16UML和设计模式17Bridge模式的示意代码publicabstractclassAbstraction//抽象化角色{protectedImplementorimp;//方法Apublicvoidoperation(){imp.operationImp();}}//修正抽象化角色publicclassRefinedAbstractionextendsAbstraction{//方法A在修正抽象化角色的实现publicvoidoperation(){//improvedlogic;}}UML和设计模式18Bridge模式的示意代码//实现化角色publicabstractclassimplementor{//方法BpublicabstractvoidoperationImp();}//具体实现化角色publicclassConcreteImplementorAextendsImplementor{//方法B在修正抽象化角色的实现publicvoidoperationImp(){System.out.println(Dosomething...);}}8.2.2例子的Bridge模式实现方案示意代码UML和设计模式19实现类图:SpaceShipT20SpaceShipT30SpaceShipT50PCSpaceShipMobileSpaceShipSpaceShipImplementorSpaceShip1111练习空中巴士(Airbus)、波音(Boeing)、麦道(Mcdonnell-Douglas)都是飞机制造商,它们都生产载客飞机(PassengerPlane)和载货飞机(CargoPlane)。现在需要设计一个系统,描述这些飞机制造商以及它们所制造的飞机种类。请画出桥接模式的实现类图。UML和设计模式208.3“开-闭”原则一个软件应该对扩展开放,对修改关闭。换言之,应当可以在不必修改源代码的情况下,改变这个模块的行为。从另外一个角度理解开闭原则,就是所谓的“对变化性的封装”原则,即找到一个系统的可变因素,将之封装起来。UML和设计模式21理解“开-闭”原则玉帝如何在美猴王的挑战之下维护天庭秩序?UML和设计模式22策略、桥接模式对“开-闭”原则的支持策略模式就是从对可变性的封装原则出发,达到“开闭”原则的一个范例:将变化的因素,即算法,进行封装,并定义一个所有算法的基类;这样当出现新算法时可方便的加入,又无需修改已有系统。桥接模式中,具体实现化类代表不同的实现逻辑,但是所有的具体实现化类又有共同的接口。新的实现逻辑可以通过创建新的具体实现化类加入到系统里面。UML和设计模式238.4组合/聚合复用原则又称合成复用原则,即:在一个新的对象中使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的任务委派达到复用已有功能的目的。复用的基本种类:组合/聚集复用、继承复用。要尽量使用对象的组合/聚合,而尽量不要使用继承。UML和设计模式24组合/聚集复用的优缺点优点:•新对象存取成员对象的唯一方法是通过成员对象的接口;•复用是黑箱复用,所需依赖较少;•每一个新类可以将焦点集中在任务上。缺点:•系统中会有较多的对象需要管理。UML和设计模式25继承复用的优缺点优点:新的实现较为容易,因为超类的大部分功能可以通过继承关系自动进入子类;修改或扩展继承而来的实现较为容易。缺点:破坏包装,因为将超类的实现细节暴漏给子类。如果超类的实现发生改变,那么子类的实现也不得不发生改变。从超类继承而来的实现是静态的,不可能在运行时间内发生改变,因此没有足够的灵活性。UML和设计模式26
本文标题:UML设计模式 8 设计模式(2)--Strategy, Bridge模式
链接地址:https://www.777doc.com/doc-3356981 .html