Add to favourites
News Local and Global in your language
17th of January 2018

因特网



Java设计模式之访问者模式 - EnjoyCodeの博客 - CSDN博客

访问者模式(Visitor):表示一个作用于某对象的结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

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

public abstract class Visitor {//为该对象结构中ConcreteElement的每一个类声明一个Visit操作 public abstract void visitConcreteElementA(ConcreteElementA concreteElementA); public abstract void visitConcreteElementB(ConcreteElementB concreteElementB); } class ConcreteVisitor1 extends Visitor { @Override public void visitConcreteElementA(ConcreteElementA concreteElementA) { System.out.println(concreteElementA.getClass().getSimpleName() + "被" + this.getClass().getSimpleName() + "访问"); } @Override public void visitConcreteElementB(ConcreteElementB concreteElementB) { System.out.println(concreteElementB.getClass().getSimpleName() + "被" + this.getClass().getSimpleName() + "访问"); } } class ConcreteVisitor2 extends Visitor { @Override public void visitConcreteElementA(ConcreteElementA concreteElementA) { System.out.println(concreteElementA.getClass().getSimpleName() + "被" + this.getClass().getSimpleName() + "访问"); } @Override public void visitConcreteElementB(ConcreteElementB concreteElementB) { System.out.println(concreteElementB.getClass().getSimpleName() + "被" + this.getClass().getSimpleName() + "访问"); } }定义一个accept操作,它以一个访问者为参数: public abstract class Element {//定义一个accept操作,它以一个访问者为参数 public abstract void accept(Visitor visitor); } class ConcreteElementA extends Element { @Override public void accept(Visitor visitor) { visitor.visitConcreteElementA(this); } } class ConcreteElementB extends Element { @Override public void accept(Visitor visitor) { visitor.visitConcreteElementB(this); } }提供一个高层的接口以允许访问者访问它的元素: public class ObjectStructure {//提供一个高层的接口以允许访问者访问它的元素 private List<Element> elements = new ArrayList<Element>(); public void attach(Element element) { elements.add(element); } public void detach(Element element) { elements.remove(element); } public void accept(Visitor visitor) { for (Element element : elements) { element.accept(visitor); } } }客户端: public class VisitorClient {//客户端 public static void main(String[] args) { ObjectStructure o = new ObjectStructure(); o.attach(new ConcreteElementA()); o.attach(new ConcreteElementB()); ConcreteVisitor1 visitor1 = new ConcreteVisitor1(); ConcreteVisitor2 visitor2 = new ConcreteVisitor2(); o.accept(visitor1); o.accept(visitor2); } }运行结果: ConcreteElementA被ConcreteVisitor1访问 ConcreteElementB被ConcreteVisitor1访问 ConcreteElementA被ConcreteVisitor2访问 ConcreteElementB被ConcreteVisitor2访问访问者适用场景:

访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。

访问者模式的用处:

访问者模式的目的是要把处理从数据结构分离出来。有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加了一个新的访问者,访问者模式将有关的行为集中到一个访问者对象中。

访问者模式的缺点:就是增加新的数据结构变得困难。

Read More




Leave A Comment

More News

互联网

中新网IT新闻

CSDN博客推荐文章

Disclaimer and Notice:WorldProNews.com is not the owner of these news or any information published on this site.