zoukankan      html  css  js  c++  java
  • 设计模式之Visitor模式(笔记)

    訪问者模式:表示一个作用于某个对象结构中的各元素操作。它使你能够不改变各元素的类的前提下定义作用于这些元素的新操作。
    这里写图片描写叙述

    首先定义一个visitor抽象类,为每一个详细类声明一个visit操作

    public abstract class Visitor {
    
        public abstract void visitConcreteElementA(ConcreteElementA elementA);
    
        public abstract void visitConcreteElementB(ConcreteElementB elementB);
    }

    接着定义继承visitor的详细类

    public class ConcreteVisitor1 extends Visitor{
    
        @Override
        public void visitConcreteElementA(ConcreteElementA elementA) {
    
            System.out.println(elementA.getClass().getName()+"訪问"+this.getClass().getName());
    
        }
    
        @Override
        public void visitConcreteElementB(ConcreteElementB elementB) {
    
            System.out.println(elementB.getClass().getName()+"訪问"+this.getClass().getName());
    
        }
    
    }
    
    
    public class ConcreteVisitor2 extends Visitor{
    
        @Override
        public void visitConcreteElementA(ConcreteElementA elementA) {
    
            System.out.println(elementA.getClass().getName()+"訪问"+this.getClass().getName());
    
        }
    
        @Override
        public void visitConcreteElementB(ConcreteElementB elementB) {
    
            System.out.println(elementB.getClass().getName()+"訪问"+this.getClass().getName());
    
        }
    
    }

    然后定义一个Element抽象类,定义一个Accept方法

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

    接着定义继承Element的详细类

    public class ConcreteElementA extends Element{
    
        @Override
        public void accept(Visitor visitor) {
    
            visitor.visitConcreteElementA(this);
    
        }
    
        public void operationA(){
    
        }
    
    }
    
    public class ConcreteElementB extends Element{
    
        @Override
        public void accept(Visitor visitor) {
    
            visitor.visitConcreteElementB(this);
    
        }
    
        public void operationB(){
    
        }
    }
    

    然后定义一个ObjectStructure类,用来枚举它的元素

    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){
            Iterator<Element> iterator=elements.iterator();
            while(iterator.hasNext()){
                Element element=iterator.next();
                element.accept(visitor);
            }
        }
    }

    client代码

    public static void main(String[] args) {
    
            //訪问者模式
            ObjectStructure oStructure=new ObjectStructure();
            oStructure.attach(new ConcreteElementA());
            oStructure.attach(new ConcreteElementB());
    
            ConcreteVisitor1 visitor1=new ConcreteVisitor1();
            ConcreteVisitor2 visitor2=new ConcreteVisitor2();
    
            oStructure.accept(visitor1);
            oStructure.accept(visitor2);
        }
  • 相关阅读:
    Eclipse 快捷键大全
    js字符串变量赋值的时候,一行写不下,想在下一行继续写
    java.lang.ClassNotFoundException: com.opensymphony.xwork2.util.TextUtils
    JS调用iframe父窗口元素和子窗口元素的方法
    no JMagick in java.library.path
    数据库建立索引的原则
    Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
    软件项目管理心得
    Errors running builder JavaScript Validator的问题
    21. Session Management
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7227001.html
Copyright © 2011-2022 走看看