访问者模式 (最复杂的)
<设计模式其实很简单>笔记
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
//抽象访问者,声明访问者可以访问哪些元素
public abstract class Visitor{
public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);
public abstract void VisitConcreteElementB(ConcreteElementA concreteElementB);
}
//具体的访问者类
public class ConcreteVisitor extends Visitor{
//覆盖父类的抽象方法
@Override
//访问构件A
public void VisitConcreteElementA(ConcreteElementA concreteElementA){
System.out.println(concreteElementA.getClass().getCanonicalName() + "被" +
this.getClass().getCanonicalName() + "访问");
}
@Override
//访问构件B
public void VisitConcreteElementB(ConcreteElementB concreteElementB){
System.out.println(concreteElementB.getClass().getCanonicalName() + "被" +
this.getClass().getCanonicalName() + "访问");
}
}
//抽象元素类
public abstract class Element{
//抽象的接受访问方法
public abstract void Accept(Visitor visitor);
}
//具体的元素A
public class ConcreteElementA extends Element{
//覆盖父类抽象方法
@Override
//接受访问方法
public void Accept(Visitor visitor){
visitor.VisitConcreteElementA(this);
}
//操作A
public void OperationA(){ }
}
//具体的元素B
public class ConcreteElementA extends Element{
//覆盖父类抽象方法
@Override
//接受访问方法
public void Accept(Visitor visitor){
visitor.VisitConcreteElementB(this);
}
//操作B
public void OperationA(){ }
}
//结构对象类, 对访问进行控制的管理者
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(int i = 0 ; i<elements.size() ; i++){
(elements.get(i)).Accept(visitor);
}
}
}
//客户端
public static void main(String[] args){
ObjectStructure objtStru = new ObjectStructure();
objtStru.Attach(new ConcreteElementA());
objtStru.Attach(new ConcreteElementB());
ConcreteVisitor concreteVisitor = new ConcreteVisitor();
objtStru.Accept(concreteVisitor);
}
//访问者模式适合数据结构相对稳定的系统,访问者模式的目的是将对数据的处理从数据结构中分离出来。
③适用的地方:
当一个对象结构包含有很多类对象,但是它们有不同的接口,并且开发人员希望对这些对象实施一些依赖于具体类的操作时。
当需要对一个对象结构中的对象进行很多不同的并且不相关的操作时。
当该对象结构被很多应用共享时。