《大话设计模式》—— 读后感(28)男人和女人——访问者模式

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 17:16   2107   0

访问者模式

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

从这个名字也可以看出来,这个模式就是针对于对象访问的模式,这个模式里面的每一各具体访问者,代表一个具体的操作,当你需要增加操作的时候十分方便,不过这个里面的访问者类和具体的去访问的类耦合十分紧密,所以说这个模式的局限性也很大,只适用于数据结构比较稳定的系统,它把数据结构和作用于结构上的操作之间的耦合解开了,转移到了访问者类之中。有比较稳定的数据结构,和易于变化的算法的话,使用访问者模式就十分方便。

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

public abstract class Visitor
{
 public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);
 public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);
}

public abstract class Element
{
 public abstract void Accept(Visitor visitor);
}

public class ConcreteElementA extends Element
{

 @Override
 public void Accept(Visitor visitor) {
  // TODO Auto-generated method stub
  visitor.visitConcreteElementA(this);
 }
 
}

public class ConcreteElementB extends Element
{

 @Override
 public void Accept(Visitor visitor) {
  // TODO Auto-generated method stub
  visitor.visitConcreteElementB(this);
 }
 
}

public class ConcreteVisitor1 extends Visitor
{

 @Override
 public void visitConcreteElementA(ConcreteElementA concreteElementA) {
  // TODO Auto-generated method stub
  System.out.println(this.getClass()+" visit "+concreteElementA.getClass());
 }

 @Override
 public void visitConcreteElementB(ConcreteElementB concreteElementB) {
  // TODO Auto-generated method stub
  System.out.println(this.getClass()+" visit "+concreteElementB.getClass());
 }
 
}

public class ConcreteVisitor2 extends Visitor
{

 @Override
 public void visitConcreteElementA(ConcreteElementA concreteElementA) {
  // TODO Auto-generated method stub
  System.out.println(this.getClass()+" visit "+concreteElementA.getClass());
 }

 @Override
 public void visitConcreteElementB(ConcreteElementB concreteElementB) {
  // TODO Auto-generated method stub
  System.out.println(this.getClass()+" visit "+concreteElementB.getClass());
 }
 
}

public class ObjectStructure
{
 private List<Element> lists = new ArrayList<Element>();
 
 public void addElement(Element element)
 {
  lists.add(element);
 }
 
 public void deleteElement(Element element)
 {
  lists.remove(element);
 }
 
 public void Accept(Visitor visitor)
 {
  for (Element element : lists) 
  {
   element.Accept(visitor);
  }
 }
}

class Client
{
 public static void main()
 {
  ObjectStructure objectStructure = new ObjectStructure();
  objectStructure.addElement(new ConcreteElementA());
  objectStructure.addElement(new ConcreteElementB());
  
  ConcreteVisitor1 concreteVisitor1 = new ConcreteVisitor1();
  ConcreteVisitor2 concreteVisitor2 = new ConcreteVisitor2();
  
  objectStructure.Accept(concreteVisitor1);
  objectStructure.Accept(concreteVisitor2);
  
 }
}

大多数时候你并不需要访问者模式,但当一旦你需要访问者模式时,那就是真的需要它了。(摘抄)

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP