`

读《研磨设计模式》-代码笔记-访问者模式-Visitor

阅读更多
声明:
本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/



import java.util.ArrayList;
import java.util.List;

interface IVisitor {
	
	//第二次分派,Visitor调用Element
	void visitConcreteElementA(ConcreteElementA elementA);
	
	void visitConcreteElementB(ConcreteElementB elementB);
	
}

/*
 * Element代表已有的功能
 * 现在要增加新的功能,由IVisitor“携带”新功能,将IVisitor传进去
 * 那IVisitor一方面可以调用Element已有的功能,一方面可定义自己的功能(新功能)
 * 达到为Element新增(扩展)功能而不改变Element的目的
 * 是为“双重分派”
 */
abstract class Element {
	
	//第一次分派,Element调用Visitor
	public abstract void accept(IVisitor visitor);
	
}


class ConcreteElementA extends Element {

	public void accept(IVisitor visitor) {
		visitor.visitConcreteElementA(this);
	}
	
	public void someExistingMethodInA() {
		System.out.println("someExistingMethodInA");
	}
}


class ConcreteElementB extends Element {

	public void accept(IVisitor visitor) {
		visitor.visitConcreteElementB(this);
	}
	
	public void someExistingMethodInB() {
		System.out.println("someExistingMethodInB");
	}
}


class ConcreteVisitor1 implements IVisitor {

	public void visitConcreteElementA(ConcreteElementA elementA) {
		System.out.println("ConcreteVisitor1 do something before elementA");
		elementA.someExistingMethodInA();
		System.out.println("ConcreteVisitor1 do something after elementA");
	}

	public void visitConcreteElementB(ConcreteElementB elementB) {
		System.out.println("ConcreteVisitor1 do something before elementB");
		elementB.someExistingMethodInB();
		System.out.println("ConcreteVisitor1 do something after elementB");
	}
	
}


//可以定义不同的Visitor,添加不同的功能
class ConcreteVisitor2 implements IVisitor {
	
	public void visitConcreteElementA(ConcreteElementA elementA) {
		System.out.println("ConcreteVisitor2 do something before elementA");
		elementA.someExistingMethodInA();
		System.out.println("ConcreteVisitor2 do something after elementA");
	}
	
	public void visitConcreteElementB(ConcreteElementB elementB) {
		System.out.println("ConcreteVisitor2 do something before elementB");
		elementB.someExistingMethodInB();
		System.out.println("ConcreteVisitor2 do something after elementB");
	}
	
}


//访问者是给一系列对象添加功能的,因此要遍历一系列对象,定义一个ObjectStructure来辅助实现
class ObjectStructure {
	
	private List<Element> elementList = new ArrayList<Element>();
	
	public void handleRequest(IVisitor visitor) {
		for (Element element : elementList) {
			element.accept(visitor);
		}
	}
	
	public void addElement(Element element) {
		this.elementList.add(element);
	}
}



/**
 * 扩展:
 * 利用组合模式和访问者模式,实现以下功能:
 * 1、输出元素的名字
 * 2、在组合元素对象前加上“节点:”,在叶子元素对象前加上“叶子:”
 */
interface IVisitorr {
	
	void visitComposite(Compositee composite);
	
	void visitLeaf(Leaff leaf);
	
}


abstract class Componentt {
	
	abstract void accept(IVisitorr visitor);
	
	//叶子元素不重写这些方法,表示不支持这些功能
	public void addChild(Componentt component) {
		throw new UnsupportedOperationException("对象不支持这个功能");
	}
	
	public void removeChild(Componentt component) {
		throw new UnsupportedOperationException("对象不支持这个功能");
	}
	
	public void getChild(int index) {
		throw new UnsupportedOperationException("对象不支持这个功能");
	}
}


class Compositee extends Componentt {

	private String name;
	private List<Componentt> childComponents = new ArrayList<Componentt>();
	
	public Compositee(String name) {
		this.name = name;
	}
	
	void accept(IVisitorr visitor) {
		visitor.visitComposite(this);
		//让访问者也访问子元素
		for (Componentt child : childComponents) {
			child.accept(visitor);
		}
	}
	
	public void addChild(Componentt component) {
		childComponents.add(component);
	}
	
	public String getName() {
		return this.name;
	}
	
}


class Leaff extends Componentt {
	
	private String name;
	
	void accept(IVisitorr visitor) {
		visitor.visitLeaf(this);
	}
	
	public Leaff(String name) {
		this.name = name;
	}
	
	public String getName() {
		return this.name;
	}
}


class PrintNameDetailVisitor implements IVisitorr {

	public void visitComposite(Compositee composite) {
		System.out.println("节点:" + composite.getName());
	}

	public void visitLeaf(Leaff leaf) {
		System.out.println("叶子:" + leaf.getName());
	}
	
}


//本来在类Composite里面已递归遍历了各元素,但为了表现Visitor模式同时为了以后更好的扩展,仍然定义一个ObjectStructure
class ObjectStructuree {
	
	private Componentt root;
	
	public void handleRequest(IVisitorr visitor) {
		if (root != null) {
			root.accept(visitor);
		}
	}
	
	public void setRoot(Componentt component) {
		this.root = component;
	}
}


/**
 * 这个类是用来测试的
 * bylijinnan
 */
public class VisitorPattern {

	public static void main(String[] args) {
		//测试基本的访问者模式
		ObjectStructure objectStructure = new ObjectStructure();
		Element elememtA = new ConcreteElementA();
		Element elememtB = new ConcreteElementB();
		objectStructure.addElement(elememtA);
		objectStructure.addElement(elememtB);
		
		IVisitor visitor = new ConcreteVisitor1();
		objectStructure.handleRequest(visitor);
		
		visitor = new ConcreteVisitor2();
		objectStructure.handleRequest(visitor);
		
		//扩展:测试组合模式和访问者模式访问节点元素和叶子元素
		System.out.println();
		
		Compositee root = new Compositee("服装");
		Compositee c1 = new Compositee("男装");
		Compositee c2 = new Compositee("女装");
		Leaff leaf11 = new Leaff("夹克");
		Leaff leaf12 = new Leaff("男衬衣");
		Leaff leaf21 = new Leaff("裙子");
		Leaff leaf22 = new Leaff("女衬衣");
		
		root.addChild(c1);
		root.addChild(c2);
		c1.addChild(leaf11);
		c1.addChild(leaf12);
		c2.addChild(leaf21);
		c2.addChild(leaf22);
		
		ObjectStructuree objectStructure2 = new ObjectStructuree();
		objectStructure2.setRoot(root);
		IVisitorr visitor2 = new PrintNameDetailVisitor();
		objectStructure2.handleRequest(visitor2);
	}

}
0
5
分享到:
评论

相关推荐

    c++设计模式-行为型模式-访问者模式

    c++设计模式-行为型模式-访问者模式;qt工程;c++简单源码; 访问者(Visitor)模式的定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新...

    研磨设计模式-part2

    完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义...第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    研磨设计模式-part4

    完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义...第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    研磨设计模式-part3

    完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义...第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    设计模式C++学习之访问者模式(Visitor)

    访问者模式(Visitor)是一种行为设计模式,它允许在不修改对象结构的前提下向对象结构中的元素添加新的操作。这种模式将算法与数据结构分离,使得算法可以独立于数据结构进行变化,增强了系统的可扩展性。 在C++中...

    C++设计模式--基于Qt4开源跨平台开发框架

    行为型模式如观察者模式(Observer)、策略模式(Strategy)和访问者模式(Visitor),关注对象之间的交互和责任分配。 在C++中,设计模式的应用通常涉及到面向对象编程的特性,如继承、封装和多态。Qt4框架则为...

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

    访问者模式(Visitor)是一种行为设计模式,它允许在不修改对象结构的前提下向对象结构中的元素添加新的操作。这种模式的核心思想是分离了算法和对象结构,使得算法可以在不改变对象结构的情况下独立变化。 访问者...

    设计模式-访问者(Visitor)模式详解和应用.pdf

    ### 设计模式-访问者(Visitor)模式详解和应用 #### 一、访问者模式简介 访问者模式(Visitor Pattern)是一种行为型设计模式,它允许我们向一组已存在的类添加新的行为,而无需修改这些类。这种模式的核心思想是在...

    设计模式-访问者模式(讲解及其实现代码)

    访问者模式是一种行为设计模式,它允许在不修改对象结构的情况下向对象添加新的操作。这种模式的核心思想是将数据结构与算法分离,使得算法可以在不改变对象结构的前提下增加对对象的操作。 在软件开发中,有时我们...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作,它可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 在C++中,这些设计模式通常通过面向对象的特性,如继承、封装和多态来实现...

    研磨设计模式(完整带书签).part2.pdf

    本电子书一共两个压缩文档,本文件为part2. 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。...第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    设计模式 - 访问者模式

    访问者模式(Visitor Pattern)是一种行为设计模式,它使你能在不修改对象结构的前提下向其添加新的操作。这种模式常用于处理具有相同接口或抽象类的对象结构,使得可以在不改变原有结构的基础上增加功能,实现对...

    java设计模式---诙谐易懂版

    代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法...访问者模式(Visitor Pattern)、状态模式(State Pattern)、原型模式(Prototype Pattern)、中介者模式(Mediator Pattern)、解释器模式...

    设计模式之访问者模式(Visitor)

    **访问者模式(Visitor)详解** 访问者模式是一种行为设计模式,它使你可以在不修改对象结构的情况下,为对象添加新的操作。这种模式的核心在于将数据结构与对这些数据的操作解耦,使得增加新的操作变得容易,同时...

    23个设计模式图解--学习笔记

    在《23个设计模式图解--学习笔记》中,我们探讨了这些模式,以便于理解和应用到实际开发中。以下是这23个设计模式的详细说明: 1. **工厂方法**(Factory Method):定义一个用于创建对象的接口,让子类决定实例化...

    研磨设计模式博文集

    如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、命令模式(Command)、责任链...状态模式(State)、访问者模式(Visitor)和解释器模式(Interpreter)...

    软件设计与体系结构-设计模式-访问者模式-ppt制作

    访问者模式(Visitor Pattern)是软件工程领域中一种重要的设计模式,主要用于处理数据结构中元素的操作问题。该模式的核心思想在于将数据操作与数据结构本身相分离,通过这种方式,可以在不改变数据结构的前提下...

    设计模式专题---设计模式示例代码(全)(python--c++)

    4. **Visitor模式**:Visitor模式属于行为设计模式,它为对象结构提供一种方式来遍历该结构中的所有对象并执行某种操作,而无需修改这些对象。这使得增加新操作变得容易,因为不需要修改现有类。 5. **Prototype...

    JAVA设计模式-chm版

    包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)...Strategy)、模板方法模式(Template Method)和访问者模式(Visitor)...

    设计模式系列之visitor

    "设计模式系列之visitor"是一个关于软件设计模式的讨论,特别是关注于“访问者”(Visitor)模式。这个模式是GOF(Gamma, Helm, Johnson, Vlissides)在他们的经典著作《设计模式:可复用面向对象软件的基础》中提出...

Global site tag (gtag.js) - Google Analytics