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);
        }
  • 相关阅读:
    软件产品案例分析(团队)
    Beta 冲刺 (2/7)
    Beta 冲刺 (1/7)
    机器学习笔记
    第一次作业
    机器学习第一个次个人作业
    软工实践个人总结
    第10组 Beta版本演示
    第10组 Beta冲刺(5/5)
    第10组 Beta冲刺(4/5)
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7227001.html
Copyright © 2011-2022 走看看