适配器模式之访问者模式

设计模式目录
http://blog.csdn.net/fenglailea/article/details/52733435
风.fox

访问者模式

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

通用类图

组成

  • 抽象访问者 Vistor
    抽象接口或类,声明访问者可以访问那些元素,具体到程序中就是Visit方法的参数定义那些对象时可以被访问的
  • 具体访问者 ConcreteVistor
    它影响访问者访问到一个类后该怎么干,要做什么事情
  • 抽象元素 Element
    接口或者抽象类,声明接受哪一类访问者访问,程序上是通过accept方法中的参数来定义
  • 具体元素 ConcreteElement
    实现accept方法,通常是visitor.vist(this)
  • 结构对象 ObjectStruture
    元素产生者,一般容纳在多个不同类,不同接口的容器,如List,Set,Map等

通用源码

JAVA

//抽象元素
public abstract class Element{
    //定义业务逻辑
    public abstract void doSomething();
    //允许谁来访问
    public abstract void accept(IVisitor visitor);
}
//具体元素
public class ConcreteElement1 extends Element{
    // 业务逻辑
    public  void doSomething(){
        ...
    }
    //允许谁来访问
    public void accept(IVisitor visitor){
        visitor.visit(this);
    }
}
public class ConcreteElement2 extends Element{
    // 业务逻辑
    public  void doSomething(){
        ...
    }
    //允许谁来访问
    public void accept(IVisitor visitor){
        visitor.visit(this);
    }
}
//抽象访问者
public interface IVisitor{
    //可以访问哪些对象
    public void visit(ConcreteElement1 el1);
    public void visit(ConcreteElement2 el2);
}
//具体访问者
public class Visitor implements IVisitor{
    //可以访问哪些对象
    public void visit(ConcreteElement1 el1){
        el1.doSomething();
    }
    public void visit(ConcreteElement2 el2){
        el2.doSomething();
    }
}
//结构对象
public class ObjectStruture{
    //对象生成器,这里通过一个工厂方法模式模拟
    public static Element createElement{
        Random rand=new Random();
        if(rand.nextInt(100)>50{
            return new ConcreteElement1();
        }else{
            return new ConcreteElement2();
        }
    }
}
//场景类
public class Client{
    public static void main(String[] args){
        for(int i=0;i<10;i++){
            //获得元素对象
            Element el=ObjectStruture.createElement();
            //接受访问者访问
            el.accept(new Visitor);
        }
    }
}

优点

符合单一职责原则
优秀的扩展性
灵活性非常高

缺点

具体元素对访问者公布细节
具体元素变更比较困难
违背了依赖导致原则

使用场景

一个对象结果包含很多类对象,他们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作,也就说是用迭代器模式已经不能胜任的情景
需要对一个对象结构中的对象进行很多不同并且不相关的操作,而你想避免让这些操作“污染”这些对象的类

时间: 2024-10-06 09:53:15

适配器模式之访问者模式的相关文章

设计模式之访问者模式

        刚刚学完设计模式的访问者模式(编译器模式),这里就对该模式进行了总结与分析. 一.产生原因         这里存在一个这样的问题:如果某系统已经完成了一个类层次并提供了满足需求的所有接口,现在要增加新的需求,我们需要怎么做?         可能你会采用增加该需求并把整个层次结构统统修改一遍.然而如果需求变动会不停的发生,而且需求的任何变动都会让整个结构统统修改一遍,此时你会怎么做呢?        所以,我们现在需要对这个系统结构进行重构,访问者模式也许就是你解决上面问题最好

php设计模式 Visitor 访问者模式

复制代码 代码如下:<?php /** * 访问者模式 * * 表示一个作用于某对象结构中的各元素的操作,可以在不改变各元素的类的前提下定义作用于这些元素的新操作 * */ abstract class Visitor { abstract public function visitCroncreteElementA($element); abstract public function visitCroncreteElementB($element); } class ConcreteVisi

设计模式学习笔记(二十)—Visitor访问者模式

Visitor模式定义: 表示一个作用于某对象结构中各元素的操作.它可以使你不修改各元素类的前提下定义作用于这些元素的新操作,也就是动态的增加新的方法. Visitor模式结构图: Visitor模式中主要角色: 1)访问者角色(Visitor):为该对象结构(ObjectStructure)中的具体元素提供一个访问操作接口.该操作接口的名字和参数标识了要访问的具体元素角色.这样访问者就可以通过该元素角色的特定接口直接访问它. 2)具体访问者角色(ConcreteVisitor):实现Visto

深入浅出Java的访问者模式

一.引子 对于系统中一个已经完成的类层次结构,我们已经给它提供了满足需求的接口.但是面对新增加的需求,我们应该怎么做呢?如果这是为数不多的几次变动,而且你不用为了一个需求的调整而将整个类层次结构统统地修改一遍,那么直接在原有类层次结构上修改也许是个 不错 的主意. 但是往往我们遇到的却是:这样的需求变动也许会不停的发生:更重要的是需求的任何变动可能都要让你将整个类层次结构修改个底朝天--.这种类似的操作分布在不同的类里面,不是一个好现象,我们要对这个结构重构一下了. 那么,访问者模式也许是你很好

.Net设计模式实例之访问者模式(Visitor Pattern)

一.访问者模式简介(Brief Introduction) 表示一个作用于某对象结构中的元素操作.它使你可以在不改变各元素类的前提下定义 作用于这些元素的新操作,它把数据结构和作用于结构上的操作之间的耦合性解脱开,使的 操作结合可以相对自由地演化.优点是增加新的操作很容易,因为增加一个新的操作就意味 着增加一个新的访问者,访问者模式将有关的行为集中到一个访问对象中. 二.解决的问题(What To Solve) 访问者模式的目的是要把处理从数据结构分离出来.如果系统有比较稳定的数据结构, 又有易

设计模式之四:访问者模式

目录介绍 1.访问者模式介绍 2.访问者模式定义 3.访问者模式UML图 4.访问者模式简单案例 5.访问者模式之Android源码分析 5.1 注解简单介绍 5.2 注解与访问者模式关系 5.3 注解与性能的关系 6.访问者模式之实践 6.1 介绍 6.2 编译期注解之ButterKnife 6.3 编译期注解之Dagger2 6.4 自己写个简单支持View的ID注入的工具 6.4.0 基本逻辑思路 7.注解之ButterKnife源码分析 7.0 简单工作流程 7.1 首先看看Bind注解

设计模式 ( 二十 ) 访问者模式Visitor(对象行为型)

特此说明:对访问者模式理解不是特别透彻,若有误,请指正,谢谢! 1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同. 例子1:顾客在超市中将选择的商品,如苹果.图书等放在购物车中,然后到收银员处付款.在购物过程中,顾客需要对这些商品进行访问,以便确认这些商品的质量,之后收银员计算价格时也需要访问购物车内顾客所选择的商品. 此时,购物车作为一个

对象-请问各位,我这样理解访问者模式正确吗,一个简单的例子

问题描述 请问各位,我这样理解访问者模式正确吗,一个简单的例子 package test; public class Client{ //数据对象二 顾客 public static void main(String[] args) { //当顾客进饭店吃饭,他不会直接跟厨师打交道, //1.饭店主要是炒菜,这时,厨师会炒很多菜 但是不知道炒哪个菜, 厨房与顾客 不具备炒菜的功能, //所以炒菜可以是厨师的功能,但是需要一个中间人来告诉厨师炒什么菜,那么我们就定义一个菜单,相当于访问者,访问厨师

Java设计模式(二十一)----访问者模式

访问者模式 一.概述 1.定义 2.分派的概念 3.分派的类型 4.双重分派 二.结构 三.具体案例 一.概述 1.定义 访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变. 2.分派的概念 变量被声明时的类型叫做变量的静态类型(Static Type),有些人又把静态类型叫做明显类型(Apparent Type):而变量所引用的对象的真实类型又叫做变量的实际类型(Actual Type).比如: List list = n