• 访问者模式


    定义:

    访问者模式(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
    测试打印
  • 相关阅读:
    Android.mk高级写法
    Android Bitmap和Canvas学习笔记
    cocos2dx 3.x 开发环境搭建
    quick cocos2d-x 2.2.4 window环境调试
    Android应用开发相关下载资源(2014/12/14更新)
    quick-cocos2dx-2.2.4环境搭建
    U盘重装Windows系统
    Visual Studio 32位64位的问题和如何编译32位64位工程的问题
    使用UE4.16开发Oculus需要Oculus软件版本高于1.11
    UE4打包程序没有声音-需要安装UE4PrereqSetup_x64.exe
  • 原文地址:https://www.cnblogs.com/cai170221/p/13438490.html
Copyright © 2020-2023  润新知