版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第11章,行为型模式,Sunny Liu weiliu_,教学内容,行为型模式 命令模式 迭代器模式 观察者模式 策略模式 模板方法模式,行为型模式,行为型模式概述 行为型模式(Behavioral Pattern)是对在不同的对象之间划分责任和算法的抽象化。 行为型模式不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用。 通过行为型模式,可以更加清晰地划分类与对象的职责,并研究系统在运行时实例对象之间的交互。在系统运行时,对象并不是孤立的,它们可以通过相互通信协作完成某些功能,一个对象在运行时也将影响到其他对象的运行。,行为型模式,行为型模式概述 行为型模式分为类行为型模式和对象行为型
2、模式两种: 类行为型模式:类的行为型模式使用继承关系在几个类之间分配行为,类行为型模式主要通过多态等方式来分配父类与子类的职责。 对象行为型模式:对象的行为型模式则使用对象的聚合关联关系来分配行为,对象行为型模式主要是通过对象关联等方式来分配两个或多个类的职责。根据“合成复用原则”,系统中要尽量使用关联关系来取代继承关系,因此大部分行为型设计模式都属于对象行为型设计模式。,行为型模式,行为型模式简介 职责链模式(Chain of Responsibility) 命令模式(Command) 解释器模式(Interpreter) 迭代器模式(Iterator) 中介者模式(Mediator) 备忘
3、录模式(Memento) 观察者模式(Observer) 状态模式(State) 策略模式(Strategy) 模板方法模式(Template Method) 访问者模式(Visitor),命令模式,模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。,命令模式,模式动机,命令模式,模式动机 命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象
4、只需要知道如何发送请求,而不必知道如何完成请求。这就是命令模式的模式动机。,命令模式,模式定义 命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。,命令模式,模式定义 Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or
5、 log requests, and support undoable operations. Frequency of use: medium high,命令模式,模式结构,命令模式,模式结构 命令模式包含如下角色: Command: 抽象命令类 ConcreteCommand: 具体命令类 Invoker: 调用者 Receiver: 接收者 Client:客户类,命令模式,模式分析 命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。 每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。 命令模式允许请求的一方和接收的一方独立开
6、来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。,命令模式,模式分析 命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。 命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才与接收者相关联。,命令模式,模式分析 典型的抽象命令类代码:,命令模式,模式分析 典型的调用者代码:,命令模式,模式分析 典型的具体命令类代码:,命令模式,模式分析 典型的请求接收者代码:,命令模式,模式分析 命令模式顺序图 :,命令模式,命令模式实例与解析 实例一:电视机
7、遥控器 电视机是请求的接收者,遥控器是请求的发送者,遥控器上有一些按钮,不同的按钮对应电视机的不同操作。抽象命令角色由一个命令接口来扮演,有三个具体的令类实现了抽象命令接口,这三个具体命令类分别代表三种操作:打开电视机、关闭电视机和切换频道。显然,电视机遥控器就是一个典型的命令模式应用实例。,命令模式,命令模式实例与解析 实例一:电视机遥控器,命令模式,命令模式实例与解析 实例一:电视机遥控器 参考代码,演示,命令模式,命令模式实例与解析 实例二:功能键设置 为了用户使用方便,某系统提供了一系列功能键,用户可以自定义功能键的功能,如功能键FunctionButton可以用于退出系统(Syste
8、mExitClass),也可以用于打开帮助界面(DisplayHelpClass)。用户可以通过修改配置文件来改变功能键的用途,现使用命令模式来设计该系统,使得功能键类与功能类之间解耦,相同的功能键可以对应不同的功能。,命令模式,命令模式实例与解析 实例二:功能键设置,命令模式,模式优缺点 命令模式的优点如下: 降低系统的耦合度。 新的命令可以很容易地加入到系统中。 可以比较容易地设计一个命令队列和宏命令(组合命令)。 可以方便地实现对请求的Undo和Redo。,命令模式,模式优缺点 命令模式的缺点如下: 使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命
9、令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。,命令模式,模式适用环境 在以下情况下可以使用命令模式: 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。 系统需要在不同的时间指定请求、将请求排队和执行请求。 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。 系统需要将一组操作组合在一起,即支持宏命令。,命令模式,模式应用 (1) Java语言使用命令模式实现AWT/Swing GUI的委派事件模型 (Delegation Event Model, DEM) 。 在AWT/Swing中,Frame、Button等界面组件是请求发送者,而AWT
10、提供的事件监听器接口和事件适配器类是抽象命令接口,用户可以自己写抽象命令接口的子类来实现事件处理,即充当具体命令类,而在具体命令类中可以调用业务处理方法来实现该事件的处理。对于界面组件而言,只需要了解命令接口即可,无需关心接口的实现,组件类并不关心实际操作,而操作由用户来实现。,命令模式,模式应用 (2) 很多系统都提供了宏命令功能,如Unix下的Shell编程,可以将多条命令封装在一个命令对象中,只需要一条简单的命令即可执行一个命令序列,这也是命令模式的应用实例之一。,命令模式,模式扩展 撤销操作的实现,命令模式,模式扩展 撤销操作的实现 参考代码,演示,命令模式,模式扩展 宏命令又称为组合
11、命令,它是命令模式和组合模式联用的产物。 宏命令也是一个具体命令,不过它包含了对其他命令对象的引用,在调用宏命令的execute()方法时,将递归调用它所包含的每个成员命令的execute()方法,一个宏命令的成员对象可以是简单命令,还可以继续是宏命令。执行一个宏命令将执行多个具体命令,从而实现对命令的批处理。,命令模式,模式扩展 宏命令,迭代器模式,模式动机 一个聚合对象,如一个列表(List)或者一个集合(Set),应该提供一种方法来让别人可以访问它的元素,而又不需要暴露它的内部结构。 针对不同的需要,可能还要以不同的方式遍历整个聚合对象,但是我们并不希望在聚合对象的抽象层接口中充斥着各种
12、不同遍历的操作。 怎样遍历一个聚合对象,又不需要了解聚合对象的内部结构,还能够提供多种不同的遍历方式,这就是迭代器模式所要解决的问题。,迭代器模式,模式动机,迭代器模式,模式动机 在迭代器模式中,提供一个外部的迭代器来对聚合对象进行访问和遍历,迭代器定义了一个访问该聚合元素的接口,并且可以跟踪当前遍历的元素,了解哪些元素已经遍历过而哪些没有。 有了迭代器模式,我们会发现对一个复杂的聚合对象的操作会变得如此简单。,迭代器模式,模式定义 迭代器模式(Iterator Pattern) :提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为
13、型模式。,迭代器模式,模式定义 Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. Frequency of use: high,迭代器模式,模式结构,迭代器模式,模式结构 迭代器模式包含如下角色: Iterator: 抽象迭代器 ConcreteIterator: 具体迭代器 Aggregate: 抽象聚合类 ConcreteAggregate: 具体聚合类,迭代器模式,模式分析 聚合是一个管理和组织数据
14、对象的数据结构。 聚合对象主要拥有两个职责:一是存储内部数据;二是遍历内部数据。 存储数据是聚合对象最基本的职责。 将遍历聚合对象中数据的行为提取出来,封装到一个迭代器中,通过专门的迭代器来遍历聚合对象的内部数据,这就是迭代器模式的本质。迭代器模式是“单一职责模式”的完美体现。,迭代器模式,模式分析 自定义迭代器 MyIterator抽象迭代器 MyCollection抽象聚合类 NewCollection具体聚合类 NewIterator具体迭代器 Client,迭代器模式,模式分析 自定义迭代器 参考代码,演示,迭代器模式,模式分析 在迭代器模式中应用了工厂方法模式,聚合类充当工厂类,而迭
15、代器充当产品类,由于定义了抽象层,系统的扩展性很好,在客户端可以针对抽象聚合类和抽象迭代器进行编程。 由于很多编程语言的类库都已经实现了迭代器模式,因此在实际使用中我们很少自定义迭代器,只需要直接使用Java、C#等语言中已定义好的迭代器即可,迭代器已经成为我们操作聚合对象的基本工具之一。,迭代器模式,迭代器模式实例与解析 实例:电视机遥控器 电视机遥控器就是一个迭代器的实例,通过它可以实现对电视机频道集合的遍历操作,本实例我们将模拟电视机遥控器的实现。,迭代器模式,迭代器模式实例与解析 实例:电视机遥控器,迭代器模式,迭代器模式实例与解析 实例:电视机遥控器 参考代码,演示,迭代器模式,模式
16、优缺点 迭代器模式的优点如下: 它支持以不同的方式遍历一个聚合对象。 迭代器简化了聚合类。 在同一个聚合上可以有多个遍历。 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无需修改原有代码,满足“开闭原则”的要求。,迭代器模式,模式优缺点 迭代器模式的缺点如下: 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。,迭代器模式,模式适用环境 在以下情况下可以使用迭代器模式: 访问一个聚合对象的内容而无需暴露它的内部表示。 需要为聚合对象提供多种遍历方式。 为遍历不同的聚合结构提供一个统一的接口。,迭代器模式
17、,模式应用 JDK 1.2 引入了新的Java聚合框架Collections。,迭代器模式,模式应用 Collection是所有Java聚合类的根接口。 在JDK类库中,Collection的iterator()方法返回一个java.util.Iterator类型的对象,而其子接口java.util.List的listIterator()方法返回一个java.util.ListIterator类型的对象,ListIterator是Iterator的子类。它们构成了Java语言对迭代器模式的支持,Java语言的java.util.Iterator接口就是迭代器模式的应用。,迭代器模式,模式应用
18、Java内置迭代器 参考代码,演示,迭代器模式,模式扩展 Java迭代器 在JDK中,Iterator接口具有如下3个基本方法: (1) Object next():通过反复调用next()方法可以逐个访问聚合中的元素。 (2) boolean hasNext():hasNext()方法用于判断聚合对象中是否还存在下一个元素,为了不抛出异常,必须在调用next()之前先调用hasNext()。如果迭代对象仍然拥有可供访问的元素,那么hasNext()返回true。 (3) void remove():用于删除上次调用next()时所返回的元素。,迭代器模式,模式扩展 Java迭代器 Java迭
19、代器可以理解为它工作在聚合对象的各个元素之间,每调用一次next()方法,迭代器便越过下个元素,并且返回它刚越过的那个元素的地址引用。但是,它也有一些限制,如某些迭代器只能单向移动。在使用迭代器时,访问某个元素的惟一方法就是调用next()。,迭代器模式,模式扩展 Java迭代器 代码示例:,观察者模式,模式动机,观察者模式,模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易
20、于扩展,这就是观察者模式的模式动机。,观察者模式,模式定义 观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。,观察者模式,模式定义 Define a one-to-many dependency between objects so that when one obje
21、ct changes state, all its dependents are notified and updated automatically. Frequency of use: high,观察者模式,模式结构,观察者模式,模式结构 观察者模式包含如下角色: Subject: 目标 ConcreteSubject: 具体目标 Observer: 观察者 ConcreteObserver: 具体观察者,观察者模式,模式分析 观察者模式描述了如何建立对象与对象之间的依赖关系,如何构造满足这种需求的系统。 这一模式中的关键对象是观察目标和观察者,一个目标可以有任意数目的与之相依赖的观察者,
22、一旦目标的状态发生改变,所有的观察者都将得到通知。 作为对这个通知的响应,每个观察者都将查询观察目标的状态以使其状态与目标状态同步。这种交互也称为发布订阅(publish-subscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅它并接收通知。,观察者模式,模式分析 典型的抽象目标类代码如下所示:,观察者模式,模式分析 典型的具体目标类代码如下所示:,观察者模式,模式分析 典型的抽象观察者代码如下所示:,观察者模式,模式分析 典型的具体观察者代码如下所示:,观察者模式,模式分析 客户端代码片段如下所示:,观察者模式,模式分析 观察者模式顺序图如
23、下所示:,观察者模式,观察者模式实例与解析 实例一:猫、狗与老鼠 假设猫是老鼠和狗的观察目标,老鼠和狗是观察者,猫叫老鼠跑,狗也跟着叫,使用观察者模式描述该过程。,观察者模式,观察者模式实例与解析 实例一:猫、狗与老鼠,观察者模式,观察者模式实例与解析 实例一:猫、狗与老鼠 参考代码,演示,观察者模式,观察者模式实例与解析 实例二:自定义登录控件 Java事件处理模型中应用了观察者模式,下面通过一个实例来学习如何自定义Java控件,并给该控件增加相应的事件。该实例基于Java Swing/AWT控件,在Swing/AWT的相关类中封装了对事件的底层处理。,观察者模式,观察者模式实例与解析 实例
24、二:自定义登录控件,观察者模式,观察者模式实例与解析 实例二:自定义登录控件 参考代码,演示,观察者模式,模式优缺点 观察者模式的优点如下: 观察者模式可以实现表示层和数据逻辑层的分离,并定义了稳定的消息更新传递机制,并抽象了更新接口,使得可以有各种各样不同的表示层作为具体观察者角色。 观察者模式在观察目标和观察者之间建立一个抽象的耦合。 观察者模式支持广播通信。 观察者模式符合“开闭原则”的要求。,观察者模式,模式优缺点 观察者模式的缺点如下: 如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它
25、们之间进行循环调用,可能导致系统崩溃。 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。,观察者模式,模式适用环境 在以下情况下可以使用观察者模式: 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变。可以降低对象之间的耦合度。 一个对象必须通知其他对象,而并不知道这些对象是谁。 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象,可以使用观察者模式创建一种链式触发
26、机制。,观察者模式,模式应用 (1) JDK1.1版本及以后的各个版本中,事件处理模型采用基于观察者模式的委派事件模型(Delegation Event Model, DEM)。 在DEM中,事件的发布者称为事件源(Event Source),而订阅者叫做事件监听器(Event Listener),在这个过程中还可以通过事件对象(Event Object)来传递与事件相关的信息,可以在事件监听者的实现类中实现事件处理,因此事件监听对象又可以称为事件处理对象。 事件源对象、事件监听对象(事件处理对象)和事件对象构成了Java事件处理模型的三要素。,观察者模式,模式应用 (2) 除了AWT中的事件
27、处理之外,Java语言解析XML的技术SAX2以及Servlet技术的事件处理机制都基于DEM,它们都是观察者模式的应用。 (3) 观察者模式在软件开发中应用非常广泛,如某电子商务网站可以在执行发送操作后给用户多个发送商品打折信息,某团队战斗游戏中某队友牺牲将给所有成员提示等等,凡是涉及到一对一或者一对多的对象交互场景都可以使用观察者模式。,观察者模式,模式扩展 Java语言提供的对观察者模式的支持 在JDK的java.util包中,提供了Observable类以及Observer接口,它们构成了Java语言对观察者模式的支持。,观察者模式,模式扩展 Java语言提供的对观察者模式的支持 Ob
28、server接口 Observable类 Observable() addObserver(Observer o) deleteObserver (Observer o) notifyObservers()、notifyObservers(Object arg) deleteObservers setChanged() clearChanged() hasChanged() countObservers(),观察者模式,模式扩展 MVC模式 MVC模式是一种架构模式,它包含三个角色:模型(Model),视图(View)和控制器(Controller)。观察者模式可以用来实现MVC模式,观察者模
29、式中的观察目标就是MVC模式中的模型(Model),而观察者就是MVC中的视图(View),控制器(Controller)充当两者之间的中介者(Mediator)。当模型层的数据发生改变时,视图层将自动改变其显示内容。,观察者模式,模式扩展 MVC模式 articles/ javase/index-142890.html,策略模式,模式动机 完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。 在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时我们可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方
30、便地增加新的解决途径。,策略模式,模式动机,策略模式,模式动机 在软件系统中,有许多算法可以实现某一功能,如查找、排序等,一种常用的方法是通过硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过ifelse等条件判断语句来进行选择。这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。,策略模式,模
31、式动机 除了提供专门的查找算法类之外,还可以在客户端程序中直接包含算法代码,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。 为了解决这些问题,我们可以定义一些独立的类来封装不同的算法,每一个类封装一个具体的算法,在这里,每一个封装算法的类我们都可以称之为策略(Strategy),为了保证这些策略的一致性我们一般会有一个抽象的策略用来做规则的定义,而具体每种算法则对应于一个具体策略。,策略模式,模式定义 策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而
32、变化,也称为政策模式(Policy)。策略模式是一种对象行为型模式。,策略模式,模式定义 Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it. Frequency of use: medium high,策略模式,模式结构,策略模式,模式结构 策略模式包含如下角色: Context: 环境类 Strategy: 抽象策略类 Concret
33、eStrategy: 具体策略类,策略模式,模式分析 策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。,策略模式,模式分析 不使用策略模式代码:,策略模式,模式分析 重构之后的抽象策略类:,策略模式,模式分析 重构之后的具体策略类:,策略模式,模式分析 重构之后的环境类:,策略模式,模式分析 客户端代码片段:,策略模式,模式分析 在策略模式中,应当由客户端自己决定在
34、什么情况下使用什么具体策略角色。 策略模式仅仅封装算法,提供新算法插入到已有系统中,以及老算法从系统中“退休”的方便,策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定。这在一定程度上提高了系统的灵活性,但是客户端需要理解所有具体策略类之间的区别,以便选择合适的算法,这也是策略模式的缺点之一,在一定程度上增加了客户端的使用难度。,策略模式,策略模式实例与解析 实例一:排序策略 某系统提供了一个用于对数组数据进行操作的类,该类封装了对数组的常见操作,如查找数组元素、对数组元素进行排序等。现以排序操作为例,使用策略模式设计该数组操作类,使得客户端可以动态地更换排序算法,可以根据需要选择冒
35、泡排序或选择排序或插入排序,也能够灵活地增加新的排序算法。,策略模式,策略模式实例与解析 实例一:排序策略,策略模式,策略模式实例与解析 实例一:排序策略 参考代码,演示,策略模式,策略模式实例与解析 实例二:旅游出行策略 旅游出行方式可以有多种,如可以乘坐飞机旅游,也可以乘火车旅游,如果有兴趣自行车游也是一种极具乐趣的出行方式。不同的旅游出行方式有不同的实现过程,客户根据自己的需要选择一种合适的旅游方式。在本实例中我们用策略模式来模拟这一过程。,策略模式,策略模式实例与解析 实例二:旅游出行策略,策略模式,模式优缺点 策略模式的优点如下: 策略模式提供了对“开闭原则”的完美支持,用户可以在不
36、修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。 策略模式提供了管理相关的算法族的办法。 策略模式提供了可以替换继承关系的办法。 使用策略模式可以避免使用多重条件转移语句。,策略模式,模式优缺点 策略模式的缺点如下: 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。,策略模式,模式适用环境 在以下情况下可以使用策略模式: 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 一个系统需要动态地在几种算法中选择一种。 如
37、果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。 不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法和与相关的数据结构,提高算法的保密性与安全性。,策略模式,模式应用 (1) Java SE的容器布局管理就是策略模式应用的一个经典实例。,策略模式,模式应用 (2)在微软公司提供的演示项目PetShop 4.0中就使用策略模式来处理同步订单和异步订单的问题。 在Petshop 4.0的BLL子项目中有一个OrderAsynchronous类和一个OrderSynchronous类,它们都继承自IorderStrategy。OrderSyn
38、chronous以一种同步的方式处理订单,而OrderAsynchronous先将订单放在队列里,然后再对队列里的订单进行处理,以一种异步方式对订单进行处理。而在BLL中的Order类里通过反射机制从配置文件中读取策略配置的信息以决定到底是使用哪种订单处理方式。只需要修改配置文件即可更改订单处理方式,提高了系统的灵活性。,模板方法模式,模式动机,模板方法模式,模式动机 模板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一。在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中。 在模板方法模式中,我们需要准备一个抽象类,将部分逻
39、辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来让子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。模板方法模式体现了面向对象的诸多重要思想,是一种使用频率较为频繁的模式。,模板方法模式,模式定义 模板方法模式(Template Method Pattern):定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法是一种类行为型模式。,模板方法模式,模式定义 Define the skeleton of an algorithm in
40、 an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithms structure. Frequency of use: medium,模板方法模式,模式结构,模板方法模式,模式结构 模板方法模式包含如下角色: AbstractClass: 抽象类 ConcreteClass: 具体子类,模板方法模式,模式分析 模板方法模式是一种类的行为型模式,在它的结
41、构图中只有类之间的继承关系,没有对象关联关系。 在模板方法模式的使用过程中,要求开发抽象类和开发具体子类的设计师之间进行协作。一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤。实现这些具体逻辑步骤的方法称为基本方法(Primitive Method),而将这些基本法方法汇总起来的方法称为模板方法(Template Method),模板方法模式的名字从此而来。,模板方法模式,模式分析 模板方法:一个模板方法是定义在抽象类中的、把基本操作方法组合在一起形成一个总算法或一个总行为的方法。 基本方法:基本方法是实现算法各个步骤的方法,是模板方法的组成部分。 抽象方法
42、(Abstract Method) 具体方法(Concrete Method) 钩子方法(Hook Method):“挂钩”方法和空方法,模板方法模式,模式分析 钩子方法(Hook Method),模板方法模式,模式分析 典型的抽象类代码如下所示:,模板方法模式,模式分析 典型的具体子类代码如下所示:,模板方法模式,模式分析 在模板方法模式中,由于面向对象的多态性,子类对象在运行时将覆盖父类对象,子类中定义的方法也将覆盖父类中定义的方法,因此程序在运行时,具体子类的基本方法将覆盖父类中定义的基本方法,子类的钩子方法也将覆盖父类的钩子方法,从而可以通过在子类中实现的钩子方法对父类方法的执行进行约束,实现子类对父类行为的反向控制。,模板方法模式,模板方法模式实例与解析 实例一:银行业务办理流程 在银行办理业务时,一般都包含几个基本步骤,首先需要取号排队,然后办理具体业务,最后需要对银行工作人员进行评分。无论具体业务是取款、存款还是转账,其基本流程都一样。现使用模板方法模式模拟银行业务办理流程。,模板方法模式,模板方法模式实例与解析 实例一:银行业务办理流程,模板方法模式,模板方法模式实例与解析 实例一:银行业务办理流
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年长春市双阳区医疗系统事业编人员招聘考试模拟试题及答案详解
- 2025年鸡西市鸡冠区教育系统事业编人员招聘考试试题及答案详解
- 2026年黑龙江省鸡西市教育系统事业编人员招聘考试备考题库及答案详解
- 2026年大同市城区医疗系统事业编人员招聘考试参考题库及答案详解
- 2026年南宁市西乡塘区教育系统事业编人员招聘考试备考题库及答案详解
- 2026年青岛市崂山区医疗系统事业编人员招聘考试参考题库及答案详解
- 2026年甘肃省庆阳市医疗系统事业编人员招聘考试备考题库及答案详解
- 2026年天津市北辰区教育系统事业编人员招聘考试备考试题及答案详解
- 2026KOL营销在消费者教育中的效果评估
- 2026生物药品研发行业创新模式深度剖析及未来趋势与投资方向研究报告
- 保密知识与保密意识培训课件
- 医学生实习体会
- 桑日县国土空间规划(2021-2035年)
- 山东宜和纺织服饰有限公司高端新材料纺织品项目环境影响报告书
- GB/T 5709-2025纺织品非织造布术语
- T-CEIA ESD1007-2024 锂离子电池生产静电防护要求
- 安防行业智能安防监控系统建设方案
- DL-T5153-2014火力发电厂厂用电设计技术规程
- 冯谖客孟尝君二
- 重大群体性突发事件应急专项预案
- 2024年泸州市兴泸水务(集团)股份有限公司招聘笔试冲刺题(带答案解析)
评论
0/150
提交评论