




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、* 第十四次第十四次 行为型设计模式行为型设计模式 Design pattern 任课老师:黄武任课老师:黄武 * 提纲提纲 迭代器设计模式(迭代器设计模式(Iterator) 访问者设计模式(访问者设计模式(Visitor) 命令设计模式(命令设计模式(Command) * 行为型软件设计模式行为型软件设计模式 行为型设计模式关心算法和对象之间的行为型设计模式关心算法和对象之间的 责任分配责任分配 行为型软件设计模式刻画了很难在运行行为型软件设计模式刻画了很难在运行 时跟踪的复杂控制流时跟踪的复杂控制流 行为型软件设计模式解释行为型软件设计模式解释对象之间是如对象之间是如 何进行交互何进行交
2、互的的 行为型软件设计模式包括行为型软件设计模式包括迭代器模式迭代器模式, 访问者模式访问者模式,命令模式命令模式,中介模式中介模式,策策 略模式略模式和和状态模式状态模式 * 1 迭代器模式(迭代器模式(Iterator) 行为型软件设计模式行为型软件设计模式 迭代器模式的应用场景迭代器模式的应用场景 迭代器模式的概念和机制迭代器模式的概念和机制 迭代器模型举例迭代器模型举例 迭代器模式讨论迭代器模式讨论 * 1.1 迭代器模式的应用场景迭代器模式的应用场景 对于复杂的数据表格,我们可以进行不同形式对于复杂的数据表格,我们可以进行不同形式 的遍历,比如按地区遍历产品,按城市遍历某的遍历,比如
3、按地区遍历产品,按城市遍历某 种产品等种产品等 * 1.1.1 迭代器模式的说明迭代器模式的说明 在面向对象的软件设计中,如果一个系在面向对象的软件设计中,如果一个系 统有比较复杂的统有比较复杂的聚合型数据结构聚合型数据结构,客户,客户 并不需要知道聚合数据结构的具体细节,并不需要知道聚合数据结构的具体细节, 而调用通用的方法就可以遍历这个聚合而调用通用的方法就可以遍历这个聚合 型的数据结构型的数据结构 * 1.1.2 迭代器模式的迭代器模式的1个应用场景个应用场景 遍历存在于链表数据结构中的客户姓名遍历存在于链表数据结构中的客户姓名 客户类中封装了一个存贮客户姓名的链客户类中封装了一个存贮客
4、户姓名的链 表表CustomerAggregate,客户首先向该链,客户首先向该链 表中插入一些姓名,然后利用表中插入一些姓名,然后利用iterator() 与一个循环输出所有姓名,最后使用与一个循环输出所有姓名,最后使用 clear()删除所有客户姓名删除所有客户姓名 * 1.1.2.1 第第1个应用场景的类图个应用场景的类图 Client +main() : void -customer:CustomerAggregate CustomerAggregate +add(name : String) +getCusList() -cusList : LinkedList 在客户类中聚集了客户
5、数据,客户直接在客户类中聚集了客户数据,客户直接 访问聚合数据访问聚合数据 * 1.1.2.2 第第1个应用部分代码个应用部分代码 public class Client public static void main ( String argv ) CustomerAggregate customer = new CustomerAggregate(); AbstractCollection cusList = customer.getCusList(); cusList.add(“Mike”); cusList.add(“Jack”); Iteratoritr = custList.ite
6、rator() while ( itr.hasNext() ) println ( itr.next() ); custList.getCusList(); * 1.1.2.3 直接在客户中访问的缺点直接在客户中访问的缺点 由于由于CustomerAggregate类中没有遍历所类中没有遍历所 封装数据结构的方法,所以客户程序必封装数据结构的方法,所以客户程序必 须知道须知道CustomerAggregate类中封装了什类中封装了什 么数据结构么数据结构,才能对该类数据进行遍历,才能对该类数据进行遍历 对于各种数据,如果都需要客户知道访对于各种数据,如果都需要客户知道访 问聚合数据类型的结构是
7、不可能的问聚合数据类型的结构是不可能的 如何使客户可以自动访问各种聚合数据如何使客户可以自动访问各种聚合数据 呢?呢? * 1.1.2.4 解决方法解决方法 Client +main() : void -customer:CustomerAggregate CustomerAggregate +createIterator() -cusList : LinkedList 在在CustomerAggregate中增加了一个内部类中增加了一个内部类 cusListIterator,专门用于遍历,专门用于遍历 CustomerAggregate类类 CusListIterator +first()
8、+next() +isDone() +currentItem() -cList : CustomerAggregate * 1.1.2.5 利用内部类访问的缺点利用内部类访问的缺点 由于由于内部类内部类在在CustomerAggregate类中,类中, 因此因此不易扩展不易扩展,而且聚合类也显得臃肿,而且聚合类也显得臃肿 为了解决这个问题,将内部类从为了解决这个问题,将内部类从 CustomerAggregate提取出来,形成一个提取出来,形成一个 单独的类单独的类 * 1.2 迭代器模式的概念与机制迭代器模式的概念与机制 迭代器模式迭代器模式是的关键思想是将对列表的是的关键思想是将对列表的
9、访问和遍历从列表对象中分离出来,放访问和遍历从列表对象中分离出来,放 入一个独立的入一个独立的迭代器对象迭代器对象中中 迭代器类定义了一个访问列表的接口迭代器类定义了一个访问列表的接口 * 1.2.1 迭代器模式的类图迭代器模式的类图 ClientIterator +first() +next() +isDone() +currentItem() Retun new ConcreteIterator() Aggregate +createIterator() ConcreteIterator +first() +next() +isDone() +currentItem() ConcreteA
10、ggregate +createIterator() * 1.2.2 迭代器模式类图说明迭代器模式类图说明 Aggregate:聚合接口,其实现子类创建并且:聚合接口,其实现子类创建并且 维持一个一种数据类型的聚合体。在其内部还维持一个一种数据类型的聚合体。在其内部还 定义了创建相应迭代器对象的接口定义了创建相应迭代器对象的接口 createInterator ConcreteAggregate:封装了一个数据存储结构,:封装了一个数据存储结构, 实现一个具体的聚合,如实现一个具体的聚合,如ArrayList 聚合对象聚合对象包含一些其它对象,目的是将这包含一些其它对象,目的是将这 些对象组成
11、一个新的整体对象些对象组成一个新的整体对象 聚合对象也叫做聚合对象也叫做容器容器 * 1.2.2.1 迭代器模式类图说明迭代器模式类图说明(续续) Iterator:迭代器定义访问和遍历元素的:迭代器定义访问和遍历元素的 接口接口 ConcreteIterator(Controller):具体迭代:具体迭代 器实现的迭代器接口,对具体聚合对象器实现的迭代器接口,对具体聚合对象 进行遍历进行遍历 * 1.2.3 迭代器模式的说明迭代器模式的说明 迭代器模式类图的聚合部分,可以包含迭代器模式类图的聚合部分,可以包含 有几种不同的具体聚合类有几种不同的具体聚合类 (ConcreteAggregate
12、)。在迭代器部分,)。在迭代器部分, 针对每个具体的聚合类,可以允许有一针对每个具体的聚合类,可以允许有一 个或者个或者多个具体的迭代器类多个具体的迭代器类,这些具体,这些具体 的迭代器类都实现同一个接口的迭代器类都实现同一个接口Iterator, 这样可简化访问设计这样可简化访问设计 ConcreteIterator跟踪聚合中的当前对象,跟踪聚合中的当前对象, 并能够计算出待遍历的后续对象并能够计算出待遍历的后续对象 * 1.2.4 迭代模式的优点迭代模式的优点 迭代器模式支持迭代器模式支持以不同的方式遍历以不同的方式遍历同一同一 个聚合,复杂的聚合可以用多种方式进个聚合,复杂的聚合可以用多
13、种方式进 行遍历。比如,二叉树遍历方法有行遍历。比如,二叉树遍历方法有4种:种: 先序遍历、中序遍历、后序遍历以及层先序遍历、中序遍历、后序遍历以及层 次遍历,可以将不同遍历算法封装到不次遍历,可以将不同遍历算法封装到不 同的迭代器类中同的迭代器类中 当修改某一个遍历算法时当修改某一个遍历算法时不会影响不会影响到其到其 它的遍历算法它的遍历算法 * 1.2.4.1 迭代器模式的优点(续)迭代器模式的优点(续) 当修改遍历的聚合结构代码时,如果该当修改遍历的聚合结构代码时,如果该 聚合结构没有改变,则相应的遍历算法聚合结构没有改变,则相应的遍历算法 不需要改变不需要改变 迭代器迭代器简化了聚合的
14、接口简化了聚合的接口,有了迭代器,有了迭代器 的遍历接口,聚合本身就不需要类似的的遍历接口,聚合本身就不需要类似的 遍历接口了遍历接口了 * 1.3 迭代器模型举例迭代器模型举例 随机生成一个整数矩阵,矩阵可以看作随机生成一个整数矩阵,矩阵可以看作 聚合类型的数据,考虑对该矩阵进行不聚合类型的数据,考虑对该矩阵进行不 同的遍历:奇数遍历和由外向内的遍历同的遍历:奇数遍历和由外向内的遍历 * 1.3.1 矩阵遍历的类图矩阵遍历的类图 SearchGUI interface Aggregate +createOddNumIterator() +createCircularIterator() Ma
15、trix +getMatrixData() +createOddNumIterator() +createCircularIterator() interface NumberIterator +hasNext():boolen +next() +remove() +getNumOfItemes() OddNumIterator +hasNext():boolen +next() +remove() +getNumOfItemes() CircularIterator +hasNext():boolen +next() +remove() +getNumOfItemes() * 1.3.2 矩
16、阵遍历说明矩阵遍历说明 在本例中,按照迭代器模式的要求,首先设计在本例中,按照迭代器模式的要求,首先设计 了一个了一个Aggregate聚合接口和一个聚合的聚合聚合接口和一个聚合的聚合 类类Matrix 在迭代器方面,设计了一个在迭代器方面,设计了一个NumberIterator接接 口,该接口有两个子类:口,该接口有两个子类:OddNumIterator和和 CircularIterator Matrix对象在创建迭代器对象时,将自己以参对象在创建迭代器对象时,将自己以参 数的形式传递给迭代器对象,迭代器对象反过数的形式传递给迭代器对象,迭代器对象反过 来可以调用来可以调用Matrix对象的
17、对象的getMatrixData()方法方法 获得全部数据,然后进行迭代遍历获得全部数据,然后进行迭代遍历 * 1.3.3 矩阵遍历的界面矩阵遍历的界面 * 1.4 迭代器模式举例迭代器模式举例2 设计一个产品销售信息查询系统,为了设计一个产品销售信息查询系统,为了 简便起见,假设本系统不涉及数据库,简便起见,假设本系统不涉及数据库, 而所有的销售信息都按照固定格式写入而所有的销售信息都按照固定格式写入 一个一个txt文档中文档中 有两种遍历数据的方式,一是按照销售有两种遍历数据的方式,一是按照销售 的产品进行遍历,一是按照日期进行遍的产品进行遍历,一是按照日期进行遍 历历 * 1.4.1 销
18、售访问系统类图销售访问系统类图 interface SalesAggregate +createSalesIterator(type) TotalSalesInfo +createSalesIterator(tyep) interface TextFileIterator +hasNext():boolen +next() +remove() +getSalesTotal() Salesterator +hasNext():boolen +next() +remove() +getSalesTotal() DateIterator +hasNext():boolen +next() +remo
19、ve() +getSalesTotal() SearchGUI SalesDataModel +getProductType +getName() +getLocation() +getPrice() : String * 1.4.2 销售访问系统类图解释销售访问系统类图解释 类类TotalSalesInfo封装一个数据类型封装一个数据类型 ArrayList SalesDataModel类的责任是从一个数据类的责任是从一个数据 文档中读出数据,然后保存到一个文档中读出数据,然后保存到一个 ArrayList对象中对象中 SalesIterator类用来对类用来对TotalSalesInfo对
20、象对象 进行迭代搜索,以便找到用户输入的所进行迭代搜索,以便找到用户输入的所 选择商品的具体信息选择商品的具体信息 * 2.访问者设计模式(访问者设计模式(Visitor) 问题的提出问题的提出 访问者设计模式的概念和机制访问者设计模式的概念和机制 访问者设计模式举例访问者设计模式举例 访问者设计模式总结访问者设计模式总结 * 2.1 问题的提出(访问者模式)问题的提出(访问者模式) 在软件设计中,经常会遇到对系统中一在软件设计中,经常会遇到对系统中一 个已经完成设计与代码编写的类的层次个已经完成设计与代码编写的类的层次 结构进行功能修改或增加新的功能。这结构进行功能修改或增加新的功能。这 种
21、修改可能经常发生,并且任何修改都种修改可能经常发生,并且任何修改都 可能导致整个类层次结构中的可能导致整个类层次结构中的大多数类大多数类 都随之修改都随之修改 访问者模式用于处理数据结构较稳定,访问者模式用于处理数据结构较稳定, 但作用于其上的但作用于其上的操作需要经常变化操作需要经常变化的问的问 题题 * 2.1.1 访问者模式的应用场景访问者模式的应用场景 西方发达国家的税收系统非常完善,细西方发达国家的税收系统非常完善,细 致,比如对于致,比如对于个人税个人税,可分为,可分为有家庭有家庭的的 和和没有家庭没有家庭的,对于的,对于有家庭有家庭的,又分为的,又分为 有小孩有小孩的和的和没有小
22、孩没有小孩的的 不同情况下需要按照不同的公式计算税不同情况下需要按照不同的公式计算税 收,这些计算是分层次的收,这些计算是分层次的 * 2.1.2 税收系统的类图税收系统的类图 +getData() +calculateTax() Tax +getData() +calculateTax() PoliticalTax +getData() +calculateTax() BusinessTax +getData() +calculateTax() CharityTax +getData() +calculateTax() IndividuleTax +getData() +calculateT
23、ax() manufactureTax +getData() +calculateTax() EntertainmentTax +getData() +calculateTax() FamilyTax +getData() +calculateTax() SingleTax +getData() +calculateTax() ElectoronicTax +getData() +calculateTax() AutomobileTax +getData() +calculateTax() FamilyWithChild +getData() +calculateTax() FamilyNoC
24、hild * 2.1.3 税收系统设计的问题税收系统设计的问题 按照以上的类图设计,每个类中均有自按照以上的类图设计,每个类中均有自 己的税收计算公式,这些计算分布到不己的税收计算公式,这些计算分布到不 同的节点中,使得每次税收计算方法的同的节点中,使得每次税收计算方法的 变化都要波及整个系统,使得整个系统变化都要波及整个系统,使得整个系统 难于维护难于维护 怎么才可以减少这种变化的影响呢?怎么才可以减少这种变化的影响呢? * 2.1.4 税收系统设计的变更税收系统设计的变更 +getData() Tax +getData() PoliticalTax +getData() BusinessT
25、ax +getData() CharityTax +getData() IndividuleTax +getData() manufactureTax +getData() EntertainmentTax +getData() FamilyTax +getData() SingleTax +getData() ElectoronicTax +getData() AutomobileTax +getData() FamilyWithChild +getData() FamilyNoChild +CalPoliticalTax() +CalElectronicTax() +CalAutomobi
26、leTax() TaxCalculation * 2.1.5 税收系统设计变更说明税收系统设计变更说明 变更的思路变更的思路是:把原来分散于层次结构是:把原来分散于层次结构 中各个节点中的税收计算方法全部汇集中各个节点中的税收计算方法全部汇集 到一个单独的类到一个单独的类TaxCalculation中中 这样,如果要对某种税收计算方法进行这样,如果要对某种税收计算方法进行 修改,则只修改修改,则只修改TaxCalculation类,而某类,而某 个节点要对税收进行计算,则调用个节点要对税收进行计算,则调用 TaxCalculation类中的相应方法即可类中的相应方法即可 这种方式又有什么缺陷呢
27、?这种方式又有什么缺陷呢? * 2.1.6 税收系统设计的访问者模式税收系统设计的访问者模式 +getData() +accept(Visitor v) Tax +getData() +accept(Visitor v) PoliticalTax +getData() +accept(Visitor v) BusinessTax +getData() +accept(Visitor v) CharityTax +getData() +accept(Visitor v) IndividuleTax +getData() +accept(Visitor v) manufactureTax +get
28、Data() +accept(Visitor v) EntertainmentTax +getData() +accept(Visitor v) FamilyTax +getData() +accept(Visitor v) SingleTax +getData() +accept(Visitor v) ElectoronicTax +getData() +accept(Visitor v) AutomobileTax +getData() +accept(Visitor v) FamilyWithChild +getData() +accept(Visitor v) FamilyNoChil
29、d +visitPoliticalTax(Tax t) +visitElectronicTax(t) +visitAutomobileTax(t) Visitor +main() Client * 2.1.7访问者模式的交互说明访问者模式的交互说明 在客户类的在客户类的main方法中,首先创建方法中,首先创建Tax层次类层次类 的对象的对象tax,然后再创建一个,然后再创建一个Visitor对象对象v,最,最 后调用后调用tax.accept(v)语句使得两个对象语句使得两个对象tax和和v开开 始交互始交互 Accept方法参数中传递进来的对象被用来调用方法参数中传递进来的对象被用来调用 V
30、isitor对象的方法对象的方法visitElectronicTax(),而该方,而该方 法中又返过来调用法中又返过来调用ElectronicTax对象的对象的 getData()方法方法 * 2.1.8 Tax对象与对象与Vistor对象的交互对象的交互 +getData():double +accept(Visitor v) Tax:ElectronicTax +visitElectronicTax(Elect ronicTax e) e.getData(); v:Visitor +main() Client v.visitElectronicTax() Tax tax = new Ele
31、ctronicTax(); Visitor v = new Visitor(); tax.accept ( v ) tax.accept(v); visitElectronicTax(tax) Tax.getData() * 2.2 访问者设计模式的概念和机制访问者设计模式的概念和机制 访问者模式(访问者模式(vistor)vistor)是指作用于一个对象结是指作用于一个对象结 构体上的构体上的元素操作元素操作,访问者可以使用户在不改,访问者可以使用户在不改 变该结构体的基础上定义一个新的操作变该结构体的基础上定义一个新的操作 访问者模式通常包含两个系列的类,一个是访问者模式通常包含两个系列的
32、类,一个是 ElementElement类类,另一个是访问者类,另一个是访问者类VisitorVisitor。访问。访问 者类定义了施加于者类定义了施加于ElementElement类上的操作,为类上的操作,为 ElementElement类提供一些功能类提供一些功能 可以定义可以定义多种具体的访问者类多种具体的访问者类,比如一个用于,比如一个用于 计算价格,另一个用于计算存货数量计算价格,另一个用于计算存货数量 * 2.2.1 访问者设计模式类图访问者设计模式类图 +accept(Visitor v) Element +main() Client v.visitElementB(this)
33、+visitElementA(ElementA) +visitElementB(ElementB) Visitor +visitElementA(ElementA) +visitElementB(ElementB) Visitor ObjectStructure +visitElementA(ElementA) +visitElementB(ElementB) Visitor +accept(Visitor v) +OperationA() ElementA +accept(Visitor v) +OperationB() ElementB * 2.2.2 访问者设计模式的组成访问者设计模式的
34、组成 Visitor:为每个:为每个Element的类声明了一的类声明了一 个访问操作,如个访问操作,如visitFamilyNoChild ConcreteVisitor:具体实现:具体实现Visitor声明声明 的方法的方法 Element:定义了一些基本的方法,其:定义了一些基本的方法,其 中包含提供基础数据的方法,如中包含提供基础数据的方法,如 getData();另外还需要有一个;另外还需要有一个accept方方 法接受访问者对象法接受访问者对象 * 2.2.3 访问者设计模式的组成访问者设计模式的组成 ConcreteElement:具体的:具体的Element子类子类 Objec
35、tStructure:提供一个高层接口,:提供一个高层接口, 允许访问者访问允许访问者访问Element的子类。该类的子类。该类 中可以包含一个结构,比如中可以包含一个结构,比如ArrayList、 Vector等,提供所要访问的等,提供所要访问的Element类类 的列表的列表 * 2.2.3 访问者设计模式的使用访问者设计模式的使用 在以下情况下使用访问者设计模式在以下情况下使用访问者设计模式 当一个对象的结构层次中,当一个对象的结构层次中,包含有多种类型包含有多种类型 的具有不同接口的对象的具有不同接口的对象,且用户要在这些对,且用户要在这些对 象上进行依赖于具体的类的运算时象上进行依赖
36、于具体的类的运算时 当有多个不同的并且互不相关的运算将作用当有多个不同的并且互不相关的运算将作用 到这些对象上到这些对象上,而用户不希望这些运算混淆,而用户不希望这些运算混淆 这些类时,可以使用访问者模式将相关的操这些类时,可以使用访问者模式将相关的操 作放到一个独立的类中作放到一个独立的类中 1.在对象的数据类型很少改变,但是需要在对象的数据类型很少改变,但是需要经常经常 改变操作或者增加新操作改变操作或者增加新操作的情况下的情况下 * 2.2.4 访问者设计模式的优点访问者设计模式的优点 访问者模式有如下优点:访问者模式有如下优点: 使得在访问者类中针对复杂类结构中的使得在访问者类中针对复
37、杂类结构中的 某个类某个类添加新方法较为容易添加新方法较为容易,即只需要,即只需要 简单地添加一个新的访问者即可简单地添加一个新的访问者即可 1.访问者将相关的方法集中在一个具体的访问者将相关的方法集中在一个具体的 访问者类中,而将其他相关的方法集中访问者类中,而将其他相关的方法集中 在另外一个具体的类中,在另外一个具体的类中,结构清晰结构清晰 * 2.2.5 访问者设计模式的缺点访问者设计模式的缺点 访问者模式的缺点是增加一个具体的新访问者模式的缺点是增加一个具体的新 ConcreteElement类比较困难,因为需要类比较困难,因为需要 在每个在每个ConcreteVisitor中添加该中
38、添加该 ConcreteElement类的访问方法类的访问方法 * 2.2.6 访问者设计模式举例访问者设计模式举例 世界名牌运动鞋专卖店销售业务软件世界名牌运动鞋专卖店销售业务软件 运动鞋的系列很少变化,包括运动鞋的系列很少变化,包括Running Shoes、WorkingShoes及及SkatingShoes 在每个系列中又包含很多品牌,如在每个系列中又包含很多品牌,如 Adidas、Nike等,就形成了一个层次结等,就形成了一个层次结 构,现设计一个销售软件实现功能构,现设计一个销售软件实现功能 计算客户要购买的运动鞋的总价格;计算客户要购买的运动鞋的总价格; 1.获得各款鞋的特点描述
39、获得各款鞋的特点描述 * 2.2.6.1 设计软件的类图设计软件的类图 Visitor +getPrice() +getDescript() +accept(v) WalkingShoes +getPrice() +getDescript() +accept(v) Nike +getPrice() +getDescript() +accept(v) NorthFace +getPrice() +getDescript() +accept(v) RunningShoes +getPrice() +getDescript() +accept(v) Adidas +getPrice() +getDe
40、script() +accept(v) Salomon +getPrice() +getDescript() +accept(v) SkatingShoes +getPrice() +getDescript() +accept(v) GlobeBlitz +getPrice() +getDescript() +accept(v) DCRover +getPrice() +getDescript() +accept(v) SportShoes +main() SportShoesGUI PriceVisitorInfoVisitor * 2.2.6.2 Visitor类图类图 +visitAdi
41、das(Adidas e) +visitSalomon(Salomon e) +visitNorthFace(Northface e) +visitNike(Nike e) +visitGlobeBlitz(GlobeBlitz e) Visitor +visitAdidas(Adidas e) +visitSalomon(Salomon e) +visitNorthFace(Northface e) +visitNike(Nike e) +visitGlobeBlitz(GlobeBlitz e) PriceVisitor +visitAdidas(Adidas e) +visitSalom
42、on(Salomon e) +visitNorthFace(Northface e) +visitNike(Nike e) +visitGlobeBlitz(GlobeBlitz e) InfoVisitor * 2.2.6.3 运动鞋销售软件界面运动鞋销售软件界面 * 3.命令命令设计模式(设计模式(Command) 问题的提出问题的提出 命令设计模式的概念和机制命令设计模式的概念和机制 命令设计模式举例命令设计模式举例 命令设计模式讨论命令设计模式讨论 * 3.1 问题的提出(命令模式)问题的提出(命令模式) 服务员向厨师传达就餐者的要求服务员向厨师传达就餐者的要求 * 3.1.1 命令模
43、式的应用场景命令模式的应用场景 一个面向对象程序包含一些一个面向对象程序包含一些互相关联的互相关联的 对象对象,每个对象都提供一些有限的、特,每个对象都提供一些有限的、特 定的功能定的功能 对于用户的请求,系统提供一些处理程对于用户的请求,系统提供一些处理程 序,而这个处理程序又使用其他对象提序,而这个处理程序又使用其他对象提 供的功能供的功能 这样设计的目的是实现这样设计的目的是实现责任分离责任分离 用户用户调用者调用者接收者接收者 * 3.1.2 命令模式的应用场景解释命令模式的应用场景解释 客户层(客户层(Client)通常是一个图形界面程通常是一个图形界面程 序,用户通过输入必要的数据
44、选择需要序,用户通过输入必要的数据选择需要 完成的功能完成的功能 客户层调用调用层(客户层调用调用层(Invoker),),调用层调用层 再根据客户的选择调用接收者(再根据客户的选择调用接收者(Receiver) 对象对象 接收者接收者对象包含实际的处理程序对象包含实际的处理程序 * 3.1.2 程序中的责任分离程序中的责任分离 责任分离责任分离使得程序易于维护与增强可扩使得程序易于维护与增强可扩 展性,因为每个部分的任务都变得单纯展性,因为每个部分的任务都变得单纯 Client SortingGUI Bubble sort Binary sort Heap sort Insertion so
45、rt Run Invoker BusinessLogic +startSort(type:string) Receiver SortAlgorithm +bubbleSort(nums) +binarySort(nums) +heapSort(nums) +insertionSort(nums)SortAlgorithm s = new SortAlgorithm() if (type.equals(“bubble”) ) s.bubbleSort(nums); if (type.equals(“heap”) ) s.heapSort(nums); * 3.1.3 前面设计的缺陷前面设计的缺陷
46、 前面的设计虽然实现了责任分离,但是前面的设计虽然实现了责任分离,但是 调用者对象与接收者对象被紧密地捆绑调用者对象与接收者对象被紧密地捆绑 在一起,这样导致了调用者对象的实现在一起,这样导致了调用者对象的实现 中包含有中包含有许多条件语句许多条件语句 为了解决该缺陷,则在调用者类与接收为了解决该缺陷,则在调用者类与接收 者类之间者类之间插入一个新的类层次结构插入一个新的类层次结构,利,利 用多态与动态绑定,去掉调用者类中的用多态与动态绑定,去掉调用者类中的 条件语句。这正是条件语句。这正是命令模式命令模式要实现的要实现的 * 3.2 命令设计模式的概念和机制命令设计模式的概念和机制 命令模式
47、命令模式的目的是解除调用者类与接收的目的是解除调用者类与接收 者类之间的耦合者类之间的耦合 命令模式为响应客户请求的行动创建一命令模式为响应客户请求的行动创建一 个抽象,即设计一个个抽象,即设计一个命令接口类命令接口类,用于,用于 声明一个共同的接口,该接口中包含一声明一个共同的接口,该接口中包含一 些具体的实现者类,每个实现者类代表些具体的实现者类,每个实现者类代表 一个不同类型的客户请求和相应的处理一个不同类型的客户请求和相应的处理 * 3.2.1 命令设计模式类图命令设计模式类图 +Operation() Receiver +main() Client Invoker +execute(
48、) interface Command +execute() ConcreteCommand1 +execute() ConcreteCommand2 Create Create Create uses uses * 3.2.2 命令设计模式类图说明命令设计模式类图说明 Client对象负责初始化对象负责初始化Command对象,并且提对象,并且提 供给供给Command对象将来要调用的方法的全部对象将来要调用的方法的全部 信息信息 Invoker调用者决定什么时候调用所要调用的调用者决定什么时候调用所要调用的 方法方法 Receiver是含有所有要调用方法的代码实现的是含有所有要调用方法的代码实现的 类实例类实例 Command对象负责提供它所代表的请求处理对象负责提供它所代表的请求处理 功能,但它不包含该功能的实际实现功能,但它不包含该功能的实际实
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年精密感光材料合作协议书
- 2025年南京市国内旅游合同(官方范本年版)
- 2025年风电铸件项目建议书
- 2025年湿式静电除尘器合作协议书
- 2025年钻井设备合作协议书
- 2025年节能、高效果蔬保鲜装置项目建议书
- 2025年光学纤维面板系列项目建议书
- 2025年弯曲机粉末冶金制品项目合作计划书
- 营销组织和管理平台设计的报告范例 (快速消费品企业)
- 山体填筑施工方案
- 国家开放大学《课程与教学论》形考任务1-4参考答案
- 药品网络交易服务三方平台质量管理体系文件-B2B平台(完整版)
- CJJ 82-2012 园林绿化工程施工及验收规范
- 服装导购工作合同范本
- DB11-T1788-2020技术转移服务人员能力规范
- 建设项目用地预审与选址意见课件讲解
- GB∕T 23524-2019 石油化工废铂催化剂化学分析方法 铂含量的测定 电感耦合等离子体原子发射光谱法
- 宝宝生日祝福可爱卡通电子相册PPT模板
- 盗窃案件现场勘查应注意的问题
- 用人单位职业健康监护档案(一人一档)
- 80吨吊车性能表
评论
0/150
提交评论