第0章:简介
访问者模式的定义:用表示“访问者”的类来访问数据结构中的元素,并把各元素的处理交给访问者类。这样,当需要增加新的处理时,我们只需要编写新的访问者,然后让数据结构可以接受访问者的访问即可。
访问者模式的本质:分离数据结构和处理
参考:研磨设计模式(书籍),大话设计模式(书籍),图解设计模式(书籍)
模式图:
待补充
第1章:实践
第0节:模板方法模式(原语、钩子操作实现)
(1)访问者接口(Visitor.java)
package com.mcc.core.designPattern.behavior.visitor; /** * 访问者接口 * * 访问者模式的定义:用表示“访问者”的类来访问数据结构中的元素,并把各元素的处理交给访问者类。 * 这样,当需要增加新的处理时,我们只需要编写新的访问者,然后让数据结构可以接受访问者的访问即可。 * 访问者模式的本质:分离数据结构和处理 * * @author <a href="mailto:417877417@qq.com">menergy</a> * My blog: https://blog.csdn.net/menergy * Created by Administrator on 2018/4/29. */ public interface Visitor { /** * 访问节点A * @param concreteNodeA */ public void visit(ConcreteNodeA concreteNodeA); /** * 访问节点B * @param concreteNodeB */ public void visit(ConcreteNodeB concreteNodeB); } |
(2)访问者1(ConcreteVisitor1.java)
package com.mcc.core.designPattern.behavior.visitor; /** * 访问者1 * * * @author <a href="mailto:417877417@qq.com">menergy</a> * My blog: https://blog.csdn.net/menergy * Created by Administrator on 2018/4/29. */ public class ConcreteVisitor1 implements Visitor { /** * 访问者1访问节点A * @param concreteNodeA */ @Override public void visit(ConcreteNodeA concreteNodeA) { System.out.println("访问者1访问节点A的方法:"); //访问者1访问节点A的方法 concreteNodeA.method(); } /** * 访问者1访问节点B * @param concreteNodeB */ @Override public void visit(ConcreteNodeB concreteNodeB) { System.out.println("访问者1访问节点B的方法:"); //访问者1访问节点B的方法 concreteNodeB.method(); } } |
(3)访问者2(ConcreteVisitor2.java)
package com.mcc.core.designPattern.behavior.visitor; /** * 访问者2 * * * @author <a href="mailto:417877417@qq.com">menergy</a> * My blog: https://blog.csdn.net/menergy * Created by Administrator on 2018/4/29. */ public class ConcreteVisitor2 implements Visitor { /** * 访问者2访问节点A * @param concreteNodeA */ @Override public void visit(ConcreteNodeA concreteNodeA) { System.out.println("访问者2访问节点A的方法:"); //访问者1访问节点A的方法 concreteNodeA.method(); } /** * 访问者2访问节点B * @param concreteNodeB */ @Override public void visit(ConcreteNodeB concreteNodeB) { System.out.println("访问者2访问节点B的方法:"); //访问者1访问节点B的方法 concreteNodeB.method(); } } |
(4)抽象节点接口(Node.java)
package com.mcc.core.designPattern.behavior.visitor; /** * 抽象节点接口(数据节点),接受一个访问者对象 * * @author <a href="mailto:417877417@qq.com">menergy</a> * My blog: https://blog.csdn.net/menergy * Created by Administrator on 2018/4/29. */ public abstract class Node { /** * 接受访问者的操作 * @param visitor */ public abstract void accept(Visitor visitor); } |
(5)具体节点A(ConcreteNodeA.java)
package com.mcc.core.designPattern.behavior.visitor; /** * 具体节点A * * @author <a href="mailto:417877417@qq.com">menergy</a> * My blog: https://blog.csdn.net/menergy * Created by Administrator on 2018/4/29. */ public class ConcreteNodeA extends Node{ /** * 接受访问者的操作 * @param visitor */ @Override public void accept(Visitor visitor) { visitor.visit(this); } /** * 节点A的方法 */ public void method(){ System.out.println("节点A自有的方法"); } } |
package com.mcc.core.designPattern.behavior.visitor; /** * @author <a href="mailto:417877417@qq.com">menergy</a> * My blog: https://blog.csdn.net/menergy * Created by Administrator on 2018/4/29. */ public class ConcreteNodeB extends Node { /** * 接受访问者的操作 * @param visitor */ @Override public void accept(Visitor visitor) { visitor.visit(this); } /** * 节点B的方法 */ public void method(){ System.out.println("节点B自有的方法"); } } |
package com.mcc.core.designPattern.behavior.visitor; import java.util.ArrayList; import java.util.List; /** * 结构对象 * 可以遍历结构中的所有元素;如果需要,提供一个高层次的接口让访问者对象可以访问每一个元素; * 如果需要,可以设计成一个复合对象或者一个聚集,如List或Set。 * * @author <a href="mailto:417877417@qq.com">menergy</a> * My blog: https://blog.csdn.net/menergy * Created by Administrator on 2018/4/29. */ public class ObjectStructure { private List<Node> nodes = new ArrayList<Node>(); /** * 执行方法操作,接受访问者的操作 * @param visitor */ public void action(Visitor visitor){ for(Node node : nodes) { node.accept(visitor); } } /** * 添加新节点 * @param node */ public void add(Node node){ nodes.add(node); } } |
package com.mcc.core.designPattern.behavior.visitor; /** * 客户端测试 * * @author <a href="mailto:417877417@qq.com">menergy</a> * My blog: https://blog.csdn.net/menergy * Created by Administrator on 2018/4/29. */ public class Client { public static void main(String[] args){ //创建一个结构对象 ObjectStructure os = new ObjectStructure(); //给结构增加一个节点A os.add(new ConcreteNodeA()); //给结构增加一个节点B os.add(new ConcreteNodeB()); //创建访问者1 Visitor visitor1 = new ConcreteVisitor1(); os.action(visitor1); System.out.println("---------------------------------------"); //给结构再增加一个节点 os.add(new ConcreteNodeA()); //创建访问者1 Visitor visitor2 = new ConcreteVisitor1(); os.action(visitor2); } } |