zoukankan      html  css  js  c++  java
  • 简易的设计模式——访问者模式

    定义

    封装一些作用于某种数据结构中得各个元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新操作。

    角色

    • Visitor抽象访问者:抽象类,声明访问者可以访问哪些元素。
    • ConcreteVisitor 具体访问者:它影响访问者后的具体业务。
    • Element 抽象元素:声明接受哪一类访问者的访问。
    • ConcreteElement 具体元素:实现accept方法,通常是Visitor.visit(this)
    • ObjectStructure 结构对象:元素的产生者。

    代码实现

    抽象元素 Element.java

    public abstract class Element {
        //定义业务逻辑
        public abstract void dosomething();
        //定义接受的访问者
        public abstract void accept(IVisitor visitor);
    }
    

    具体元素 ConcreteElement1.java

    public class ConcreteElement1 extends Element {
    
        @Override
        public void dosomething() {
            //处理业务
        }
    
        @Override
        public void accept(IVisitor visitor) {
            visitor.visit(this);
        }
    }
    

    具体元素 ConcreteElement2.java

    public class ConcreteElement2 extends Element {
    
        @Override
        public void dosomething() {
            //处理业务
        }
    
        @Override
        public void accept(IVisitor visitor) {
            visitor.visit(this);
        }
    
    }
    

    抽象访问者 Visitor.java

    public interface IVisitor {
        public void visit(ConcreteElement1 concreteElement1);
        public void visit(ConcreteElement2 concreteElement2);
    }
    

    具体访问者 Visitor.java

    public class Visitor implements IVisitor {
        @Override
        public void visit(ConcreteElement1 concreteElement1) {
            concreteElement1.dosomething();
        }
    
        @Override
        public void visit(ConcreteElement2 concreteElement2) {
            concreteElement2.dosomething();
        }
    }
    

    结构对象 ObjectStruture.java

    public class ObjectStruture {
    
        //对象生成器
        public static Element createElement(){
    
            Random rand = new Random();
    
            if (rand.nextInt(100) > 50){
                return new ConcreteElement1();
            }else{
                return new ConcreteElement2();
            }
    
        }
    
    }
    

    场景类 Client.java

    public class Client {
        public static void main(String args[]){
            for (int i = 0; i < 10; i++) {
                Element ele = ObjectStruture.createElement();
                ele.accept(new Visitor());
            }
        }
    }
    

    访问者模式的优点

    1. 符合单一职责的原则:具体元素负责数据的加载,访问者负责报表的展现。
    2. 优秀的扩展性:这是职责分开导致数据扩展的快捷。
    3. 灵活性高:可以把多个具体元素的数据提供给一个访问者,由访问者统计数据。

    访问者模式的缺点

    1. 具体元素对访问者公布细节:访问者访问一个类需要知道这个类里面的具体细节。
    2. 具体元素变得比较困难:具体元素一旦发生变化,那么访问者就需要修改。
    3. 违背了依赖倒置原则:访问者访问的是具体元素,而不是抽象元素。

    使用场景

    业务要求遍历多个不同类型的对象,这也是访问者模式的初衷,访问者模式是对迭代器模式的扩展,可以遍历不同的对象,然后执行不同的操作,也就是针对不同的对象,执行不同的操作。

  • 相关阅读:
    Node 之 Express 4x 骨架详解
    Express中app.use()用法 详解
    纯手打AJAX,还有一个对象转查询字符串的小方法obj=>url
    简单node服务器demo,麻雀虽小,五脏俱全
    node环境下多种方式“get数据解析”
    module.exports与exports,export与export default的区别
    2019年9月Github上最热门的JavaScript开源项目
    基于Node 的http转发demo,项目中请使用express+http-proxy-middleware
    HTTP/2 新特性总结
    TensorFlow 8 bit模型量化
  • 原文地址:https://www.cnblogs.com/whthomas/p/4432918.html
Copyright © 2011-2022 走看看