问答题 阅读以下关于面向对象系统建模的叙述,根据要求回答下面问题。
[说明]
某软件企业为影音产品销售公司W开发一套在线销售系统,以提升服务的质量和效率。项目组经过讨论后决定采用面向对象方法开发该系统。在设计建模阶段需要满足以下设计要求:
(1)W公司经常进行促销活动。根据不同的条件(如订单总额、商品数量、产品种类等),公司可以提供百分比折扣或现金减免等多种促销方式,以供提交订单的用户选择。实现每种促销活动的代码量很大,且会随促销策略的不同而经常修改。系统设计中需要考虑现有的促销和新的促销,而不用经常地重写控制器类代码。
(2)该在线销售系统需要计算每个订单的税率,不同商品的税率及计算方式会有所区别。所以W公司决定在系统中直接调用不同商品供应商提供的税率计算类,但每个供应商的类提供了不同的调用方法。系统设计中需要考虑如果公司更换了供应商,应该尽可能少地在系统中修改或创建新类。
项目组架构师决定采用设计模式来满足上述设计要求,并确定从当前已经熟练掌握的设计模式中进行选择,这些设计模式包括:适配器模式(Adapter)、构造器模式(Builder)、命令模式(Command)、外观模式(Facade)、中介模式(Mediator)、原型模式(Prototype)、代理模式(Proxy)、状态模式(State)和策略模式(Strategy)等。
问答题 设计模式按照其应用模式可以分为三类:创建型、结构型和行为型,请用200字以内的文字说明三者的作用。
【正确答案】
【答案解析】创建型模式主要用于创建对象,为设计类实例化新对象提供指南。结构型模式主要用于处理类或对象的组合,对类如何设计以形成更大的结构提供指南。
行为型模式主要用于描述类或对象的交互以及职责的分配,对类之间交互以及分配责任的方式提供指南 设计模式(Design Pattern)是一套被反复使用、多数人知晓、经过分类编目、代码设计经验的总结。GoF的书中共有23个设计模式,这些模式可以按两个准则来分类:①是按设计模式的目的划分,可分为创建型、结构型和行为型3种模式;②是按设计模式的范围划分,可分为类设计模式和对象设计模式。
创建型模式是对对象实例化过程的抽象,通过采用抽象类所定义的接口,封装了系统中对象如何创建、组合等信息。该模式主要用于创建对象,为设计类实例化新对象提供指南。它允许在系统中创建对象,而不需要在代码中标识特定类的类型,这样用户就不需要编写大量、复杂的代码来初始化对象。它是通过该类的子类来创建对象的。但是,这可能会限制在系统内创建对象的类型或数目。
结构型模式主要用于处理类或对象的组合,对类如何设计以形成更大的结构提供指南。它一般借鉴封装、代理、继承等概念将一个或多个类、对象进行组合、封装,以提供统一的外部视图或新的功能。该模式允许在不重写代码或自定义代码的情况下创建系统,从而使系统具有增强的重复使用性和应用性能。该模式控制了应用程序较大部分之间的关系,将以不同的方式影响应用程序。
行为型模式主要用于描述类或对象的交互以及职责的分配,对类之间交互以及分配责任的方式提供指南。它不仅描述对象或类的模式,还描述它们之间的通信模式,特别是描述一组对等的对象怎样相互协作以完成其中任一对象都无法单独完成的任务。该模式可以影响一个系统的状态和行为流。通过优化状态和行为流转换和修改的方式,可以简化、优化并且提高应用程序的可维护性。
问答题 请将项目组已经掌握的设计模式按照其作用分别归类到创建型、结构型和行为型模式中。
【正确答案】
【答案解析】创建型模式:构造器模式、原型模式
结构型模式:适配器模式、外观模式、代理模式
行为型模式:命令模式、中介模式、状态模式和策略模式 创建型模式主要有:Factory Method(工厂方法)、Abstract Factory(抽象工厂)、Builder(构造器)、Prototype(原型)和Singleton(单独)等模式。
结构型模式主要有:Adapter(适配器)、Bridge(桥接)、Composite(组成)、Decorator(装饰)、Facade(外观)、Flyweight(享元)、Proxy(代理)等。
行为型模式主要有:Interpreter(解释器)、Template Method(模板方法)、Chain of Responsibility(职责链)、Command(命令)、Iterator(迭代器)、Mediator(中介者)、Memento(备忘录)、Observer(观察者)、State(状态)、Strategy(策略)和Visitor(访问者)等。
问答题 针对题目中所提出的设计要求(1)和(2),项目组应该分别选择何种设计模式?请分别用200字以内的文字说明具体的解决方案。
【正确答案】
【答案解析】设计要求(1):选择策略(Strategy)设计模式;具体的解决方案是:在具有公共接口的独立类中定义每个计算;可以利用策略模式创建各种促销类,它们从同一个超类继承:每个类都有相同名称的标准接口方法,用于根据订单编号计算将要折扣的金额总数;计算每个促销的内部代码对促销类来说完全不同。设计要求(2):选择适配器(Adapter)设计模式;具体的解决方案是:增加一个类作为适配器,转换类的接口到客户端类期望的另一个接口;实现一个适配器类,这一个类为系统的其他部分提供了一个不变的方法,以供调用,从而集成不同商品供应商提供的税率计算类;编写一个适配器类的子类,包含调用购买类所需的代码;该子类将系统的调用映射到某个供应商的税率计算类;若要求更换供应商,则只需编写一个新的适配器子类,其他保持不变。 依题意,该在线销售系统的设计要求(1)中,不同的促销方法有不同的实现代码,在不同促销活动中需要能够替换实现代码,适合采用策略(Strategy)设计模式。因为策略模式是一种对象的行为型模式,其设计意图是:定义一系列算法,并将每一个算法封装起来,并让它们可以相互替换,使得算法可独立于使用它的客户而变化。该模式能够将行为和环境分隔,当出现新的行为时,只需要实现新的行为型模式。针对该设计要求,具体的解决方案是:在具有公共接口的独立类中定义每个计算:可以利用策略模式创建各种促销类,它们从同一个超类继承;每个类都有相同名称的标准接口方法,用于根据订单编号计算将要折扣的金额总数;计算每个促销的内部代码对促销类来说完全不同。
在该在线销售系统的设计要求(2)中,不同商品供应商提供的税率计算类需要提供统一的方法调用接口,适合采用适配器(Adapter)设计模式。因为适配器模式的设计意图是:通过将一个类的接口转换成客户希望的另外一个接口,从而使原本由于接口不兼容而不能一起工作的那些类可以一起工作。该模式既可以作为类结构型模式,也可以作为对象结构型模式。在作为类结构型模式中,通过使用一个具体类将适配者适配到目标接口中;在作为对象结构型模式中,一个适配器可以将多个不同的适配者适配到同一个目标。针对该设计要求,具体的解决方案是:增加一个类作为适配器,转换类的接口到客户端类期望的另一个接口;实现一个适配器类,这一个类为系统的其他部分提供了一个不变的方法,以供调用,从而集成不同商品供应商提供的税率计算类;编写一个适配器类的子类,包含调用购买类所需的代码;该子类将系统的调用映射到某个供应商的税率计算类;若要求更换供应商,则只需编写一个新的适配器子类,其他保持不变。