设计模式(23)------访问者模式

来源:互联网 发布:手机绿色上网软件 编辑:程序博客网 时间:2024/06/08 17:27

访问者模式作用:

表示作用于某个对象结构中的各个元素的操作,

使得可以在不改变各元素的类的前提下定义作用于这些元素的新操作。


应用场景:

(1)一个对象结构包含很多类对象,它们有不同的接口,但是想对这些对象实施一些依赖于其具体类的操作。

(2)需要对一个对象中的对象进行许多不相关的操作,但是,我们想避免这些操作耦合这些对象。

(3)定义对象结构的类很少改变,但是经常需要在这个对象上定义新的操作。


参与对象:

(1)Visitor

为该对象结构中的ConcreteElement的每一个类声明一个visit操作。

该操作的名字和特征标识类发送visit请求给该访问者的哪个类。

这使得访问者可以确认正被访问元素的具体的类。

这样访问者可以通过该元素的特定接口直接访问它。

(2)ConcreteVisitor

实现每个Visitor操作声明的接口。

(3)Element

定义一个Accept操作,它以一个访问者为参数。

(4)ConcreteElement

实现Accept操作,该操作以一个访问者为参数。

(5)ObjectStructure

提供一个高层接口,允许访问者访问他们。


eg:

Visitor

package com.lanhuigu.base.design.behavior.visitor;/** * Visitor: 为该对象结构中的ConcreteElement的每一个类声明一个visit操作。 */public interface Visitor {public void visitString(StringElement strE);public void visitFloat(FloatElement floatE);}

ConcreteVisitor

package com.lanhuigu.base.design.behavior.visitor;/** * Concretevisitor: 实现每个Visitor操作声明的接口 */public class ConcreteVisitor implements Visitor {@Overridepublic void visitString(StringElement strE) {// TODO Auto-generated method stubSystem.out.println(strE.getSe());}@Overridepublic void visitFloat(FloatElement floatE) {// TODO Auto-generated method stubSystem.out.println(floatE.getFe());}}

Element

package com.lanhuigu.base.design.behavior.visitor;/** * Element: 定义一个Accept操作,它以一个访问者为参数。 */public interface Visitable {public void accept(Visitor visitor);}

ConcreteElement

package com.lanhuigu.base.design.behavior.visitor;/** * ConcreteElement: 实现Accept操作,该操作以一个访问者为参数。 */public class StringElement implements Visitable {private String se;public StringElement(String se) {// TODO Auto-generated constructor stubthis.se = se;}public String getSe() {return se;}public void setSe(String se) {this.se = se;}@Overridepublic void accept(Visitor visitor) {// TODO Auto-generated method stubvisitor.visitString(this);}}

package com.lanhuigu.base.design.behavior.visitor;/** * ConcreteElement: 实现Accept操作,该操作以一个访问者为参数。 */public class FloatElement implements Visitable {private Float fe;public FloatElement(Float fe) {// TODO Auto-generated constructor stubthis.fe = fe;}public Float getFe() {return fe;}public void setFe(Float fe) {this.fe = fe;}@Overridepublic void accept(Visitor visitor) {// TODO Auto-generated method stubvisitor.visitFloat(this);}}

Client


package com.lanhuigu.base.design.behavior.visitor;public class Test {public static void main(String[] args) {Visitor visitor = new ConcreteVisitor();StringElement stringElement = new StringElement("strtest");stringElement.accept(visitor);FloatElement floatElement = new FloatElement(new Float(1.5));floatElement.accept(visitor);}}

运行结果:




0 0