设计模式——15模板方法模式与访问者模式
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
insertCard(); validateCard(); useATM(); popCard();
Withdraw
+ <<Override>> useATM () : void
ShowBalance
+ <<Override>> useATM () : void
Transfer
+ <<Override>> useATM () : void
ObjectStructure
Element
+ accept (Visitor v) : void
ConcreteElementA
+ accept (Visitor v) : void + operationA () : void
ConcreteElementB
+ accept (Visitor v) : void + operationB () : void
Apple
+ <<Implement>> accept (Visitor visitor) : void
Books
+ <<Implement>> accept (Visitor visitor) : void
访问者模式(续)
实例分析 实例一:购物车(代码实现)
访问者模式(续)
Client Visitor
实例分析 实例二:汽车访问模拟(代码实现)
访问者模式(续)
模式优缺点 访问者模式有如下的优点:
访问者模式使得增加新的操作变得很容易。如果一些操作依赖于一个复杂的结
构对象的话,那么一般而言,增加新的操作会很复杂。而使用访问者模式,增 加新的操作就意味着增加一个新的访问者类,因此将变得很容易。
模版方法模式需要开发抽象类和具体子类的设计师之间的协作。一个设计师负
责给出一个算法的轮廓和骨架,另一些ห้องสมุดไป่ตู้计师则负责给出这个算法的各个逻辑
步骤。代表这些具体逻辑步骤的方法称做基本方法(primitive method);而将
这些基本法方法总汇起来的方法叫做模版方法(template method),这个设计 模式的名字就是从此而来。
模板方法模式(续)
实例分析 实例二:ATM机的使用模板(代码实现)
模板方法模式(续)
模式优缺点
模板方法模式在一个类中形式化地定义算法,而由它的子类实现细节的处理。
模板方法模式的优势是,在子类定义详细的处理算法时不会改变算法的结构。
模板方法是一种代码复用的基本技术,它们在类库中尤为重要,它们提取了类
访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节
模板方法模式(续)
模式定义 模板方法(Template Method):定义一个操作中算法的骨架,而将一些
步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即 可重定义该算法的某些特定步骤。模板方法是一种类行为型模式。
模板方法模式(续)
模式结构
AbstractClass
+ templateMethod () + primitiveOperation1 () + primitiveOperation2 () ... primitiveOperation1(); ... primitiveOperation2(); ...
+ + + + visit (Car car) visit (Body body) visit (Engine engine) visit (Wheel wheel) : void : void : void : void
实例分析
+ main (String a[]) : void
实例二:汽车访问模拟
访问者模式(续)
模式定义 访问者模式(Visitor Pattern):表示一个作用于某对象结构中的各元素的
操作。它使我们可以在不改变各元素的类的前提下定义作用于这些元
素的新操作。访问者模式是一种对象行为型模式。
访问者模式(续)
Client Visitor
+ visitConcreteElementA (ConcreteElementA a) : void + visitConcreteElementB (ConcreteElementB b) : void
并将可变的行为留给子类来实
现。
各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代
码重复。
控制子类的扩展。
模板方法模式(续)
模式应用 模板方法模式主要应用于框架设计
Java单元测试工具JUnit
练
习
模板方法模式中有哪些参与者,简述其职责。 比较抽象方法和钩子方法,分析它们应用场合的异同。
Engineer
Engineer (String name) visit (Car car) visit (Body body) visit (Engine engine) visit (Wheel wheel)
: void : void : void : void
: void : void : void : void
访问者模式
模式动机 Java提供了大量集合对象,但大多数情况下处理的都是同类对象的聚
集。换言之,在聚集上采取的操作都是一些针对同类型对象的同类操
作。但是如果针对一个保存有不同类型对象的聚集采取某种操作该怎 么办呢?粗看上去,这似乎不是什么难题。可是如果需要针对一个包 含不同类型元素的聚集采取某种操作,而操作的细节根据元素的类型 不同而有所不同时,就会出现必须对元素类型做类型判断的条件转移 语句。这个时候,使用访问者模式就是一个值得考虑的解决方案。
模板方法模式(续)
实例分析 实例二:ATM机的使用模板
ATMTemplate
{abstract}
+ + + + +
insertCard () validateCard () useATM () popCard () process ()
: void : void : void : void : void
: void : void : void : void : void
connDB(); openDB(); useDB(); closeDB();
DBOperatorSubA
+ connDB () : void
DBOperatorSubB
+ connDB () : void
模板方法模式(续)
实例分析 实例一:数据库连接模板实现(代码实现)
Car
- engine : Engine - body : Body - wheels : Wheel + accept (Visitor v) body = new Engine() = new Body() = {... : void
engine
wheels
Body
+ accept (Visitor v) : void
库中的公共行为。
模板方法导致一种反向的控制结构,一个父类调用一个子类的操作,而不是相
反。
模板方法的缺点在于每个不同的实现都需要定义一个子类,这会导致类的个数
增加,但是更加符合类职责的分配原则,使得类的内聚性得以提高。
模板方法模式(续)
模式使用 在以下情况下可以使用模板方法模式:
一次性实现一个算法的不变的部分,
ConcreteClass
+ primitiveOperation1 () + primitiveOperation2 ()
模板方法模式(续)
参与者 AbstractClass:抽象类
ConcreteClass:具体子类
模板方法模式(续)
模式解释 模版方法中的方法可以分为两大类:模版方法(Template Method)和
访问者模式(续)
实例分析 实例一:购物车
Client
+ main (String a[]) : void
Visitor
+ visit (Apple apple) : void + visit (Books book) : void
Saler
- name : String + <<Constructor>> Saler (String name) + <<Implement>> visit (Apple apple) : void + <<Implement>> visit (Books book) : void
Engine
+ accept (Visitor v) : void
Wheel
- name : String + <<Constructor>> Wheel (String name) + getName () : String + accept (Visitor v) : void
访问者模式(续)
基本方法(Primitive Method)。
模版方法 基本方法 抽象方法 具体方法
钩子方法
模板方法模式(续)
实例分析 实例一:数据库连接模板实现
DBOperator
{abstract}
+ + + + +
connDB () openDB () useDB () closeDB () process ()
- v : Vector = new Vector() + accept (Visitor visitor) : void + addProduct (Product product) : void + removeProduct (Product product) : void
Product
+ accept (Visitor visitor) : void
模式结构
ConcreteVisitor1
+ visitConcreteElementA (ConcreteElementA a) : void + visitConcreteElementB (ConcreteElementB b) : void
ConcreteVisitor2
+ visitConcreteElementA (ConcreteElementA a) : void + visitConcreteElementB (ConcreteElementB b) : void
Customer
- name : String + <<Constructor>> + <<Implement>> + <<Implement>> + <<Implement>> + <<Implement>> Customer (String name) visit (Car car) visit (Body body) visit (Engine engine) visit (Wheel wheel) - name : String + <<Constructor>> + <<Implement>> + <<Implement>> + <<Implement>> + <<Implement>>
模板方法模式 与访问者模式
Sunny Liu weiliu_china@
内
容
模板方法模式 访问者模式
模板方法模式
模式动机
准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后
声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式 实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模版方法模式的 用意。很多人可能没有想到,模版方法模式实际上是所有模式中最为常见的几 个模式之一,而且很多人可能使用过模版方法模式而没有意识到自己已经使用 了这个模式。模版方法模式是基于继承的代码复用的基本技术,模版方法模式 的结构和用法也是面向对象设计的核心。
Customer
- name : String + <<Constructor>> Customer (String name) + <<Implement>> visit (Apple apple) : void + <<Implement>> visit (Books book) : void
BuyBasket
v.visitConcreteElementA(this);
v.visitConcreteElementB(this);
访问者模式(续)
参与者 Vistor:抽象访问者
ConcreteVisitor:具体访问者
Element:抽象元素 ConcreteElement:具体元素 ObjectStructure:对象结构