zoukankan      html  css  js  c++  java
  • 访问者模式

    定义:

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

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

    访问者模式的目的是,要把处理从数据结构上分离出来。有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式是比较的适合的,因为访问者模式使算法的操作增加变得容易。

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

     自己理解思路图:

     实现代码如下:

    1 public abstract class Visitor {
    2     public abstract void visitConcreteElementA(ConcreteElementA conA);
    3     public abstract void visitConcreteElementB(ConcreteElementB conB);
    4 }
    Visitor
     1 public class ConcreteVisitor1 extends Visitor {
     2 
     3     @Override
     4     public void visitConcreteElementA(ConcreteElementA conA) {
     5         System.out.println(this.getClass().getName()+"----"+conA.getClass().getName());
     6 
     7     }
     8 
     9     @Override
    10     public void visitConcreteElementB(ConcreteElementB conB) {
    11         System.out.println(this.getClass().getName()+"----"+conB.getClass().getName());
    12     }
    13 
    14 }
    ConcreteVisitor1
     1 public class ConcreteVisitor2 extends Visitor {
     2 
     3     @Override
     4     public void visitConcreteElementA(ConcreteElementA conA) {
     5         System.out.println(this.getClass().getName()+"----"+conA.getClass().getName());
     6 
     7     }
     8 
     9     @Override
    10     public void visitConcreteElementB(ConcreteElementB conB) {
    11         System.out.println(this.getClass().getName()+"----"+conB.getClass().getName());
    12 
    13     }
    14 
    15 }
    ConcreteVisitor2
    1 public abstract class Element {
    2     public abstract void accept(Visitor visitor);
    3 }
    Element
     1 public class ConcreteElementA extends Element{
     2 
     3     @Override
     4     public void accept(Visitor visitor) {
     5         visitor.visitConcreteElementA(this);
     6     }
     7     public void operateA(){
     8         
     9     }
    10 
    11 }
    ConcreteElementA
     1 public class ConcreteElementB extends Element{
     2 
     3     @Override
     4     public void accept(Visitor visitor) {
     5         visitor.visitConcreteElementB(this);
     6     }
     7     
     8     public void operateB(){
     9         
    10     }
    11 
    12 }
    ConcreteElementB
     1 public class TestVisitor {
     2     public static void main(String[] args) {
     3         ObjectStructure ob = new ObjectStructure();
     4         ob.attach(new ConcreteElementA());
     5         ob.attach(new ConcreteElementB());
     6         
     7         Visitor v1 = new ConcreteVisitor1();
     8         Visitor v2 = new ConcreteVisitor2();
     9         
    10         ob.accept(v1);
    11         ob.accept(v2);
    12         
    13     }
    14 }
    test
    com.cai.designMethods.visitor.ConcreteVisitor1----com.cai.designMethods.visitor.ConcreteElementA
    com.cai.designMethods.visitor.ConcreteVisitor1----com.cai.designMethods.visitor.ConcreteElementB
    com.cai.designMethods.visitor.ConcreteVisitor2----com.cai.designMethods.visitor.ConcreteElementA
    com.cai.designMethods.visitor.ConcreteVisitor2----com.cai.designMethods.visitor.ConcreteElementB
    测试打印
  • 相关阅读:
    AngularJS指令的详解
    Linux(Ubuntu)下如何安装JDK
    Hibernate的三种状态
    JS是按值传递还是按引用传递
    git分支管理
    Hibernate注解映射联合主键的三种主要方式
    Linux下解决用户不能执行sudo的方法
    【GStreamer开发】GStreamer基础教程03——动态pipeline
    【GStreamer开发】GStreamer基础教程02——GStreamer概念
    【GStreamer开发】GStreamer基础教程02——GStreamer概念
  • 原文地址:https://www.cnblogs.com/cai170221/p/13438490.html
Copyright © 2011-2022 走看看