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. 违背了依赖倒置原则:访问者访问的是具体元素,而不是抽象元素。

    使用场景

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

  • 相关阅读:
    Siege 3.0 正式版发布,压力测试工具
    Pomm 1.1.2 发布,专为 PG 设计的 ORM 框架
    Whonix 0.5.6 发布,匿名通用操作系统
    国内开源 java cms,Jspxcms 2.0 发布
    EZNamespaceExtensions.Net v2013增加对上下文菜单、缩略图、图标、属性表的支持
    GNU Guile 2.0.9 发布,Scheme 实现
    jdao 1.0.4 发布 轻量级的orm工具包
    OpenSearchServer 1.4 RC4 发布
    Percona Server for MySQL 5.5.3030.2
    Samba 4.0.5 发布
  • 原文地址:https://www.cnblogs.com/whthomas/p/4432918.html
Copyright © 2011-2022 走看看