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

//从定义上看。这个模式跟装饰模式的定义非常类似(动态地给一个对象加入一些额外的职责),可是装饰模式很多其它是在原有的基础上进行功能加强或者改动。而訪问者模式很多其它是为对象加入全新的功能。訪问者模式适合那些须要频繁为某些类加入新功能、新操作的项目。

//模式结构:
//Visitor:訪问者接口。为全部的訪问者对象声明一个visit方法。用来表示对对象结构加入的功能,理论上能够代表随意的功能
//ConcreteVisitor:详细的訪问者实现对象,实现要真正被加入到对象结构中的功能
//Element:抽象的元素对象,对象结构的顶层接口,定义接受訪问的操作
//ConcreteElement:详细元素对象。对象结构中详细的对象,也是被訪问的对象,一般会回调訪问者的真实功能。同一时候开放自身的数据供訪问者使用
//ObjectStructure:对象结构,通常包括多个被訪问的对象。它能够遍历多个被訪问的对象,也能够让訪问者訪问它的元素
//实例:在原有基础上添加新功能
//以下是使用了訪问者模式的初始代码,之后要在它的基础上进行扩展
//用户抽象类
public abstract class Customer {
private String customerId;
private String name;
//get set methods
public abstract void accept(Visitor visitor);
}
//企业客户类
public class EnterpriseCustomer extends Customer {
private String linkman;
private String linkTelephone;
private String registerAddress;
//get set methods
public void accept(Visitor visitor) {
visitor.visitEnterpriseCustomer(this);
}
}
//个人客户类
public class PersonalCustomer extends Customer {
private String telephone;
private int age;
//get set methods
public void accept(Visitor visitor) {
visitor.visitPersonalCustomer(this);
}
}
//訪问者接口
public interface Visitor {
public void visitEnterpriseCustomer(EnterpriseCustomer ec);
public void visitPersonalCustomer(PersonalCustomer pc);
}
//详细的訪问者。实现客户提出服务请求的功能,这个功能是模仿原有的功能,能够直接在详细类中给出
public class ServiceRequestVisitor implements Visitor {
public void visitEnterpriseCustomer(EnterpriseCustomer ec) {
// 拿到了企业用户对象的数据
System.out.prinln(ec.getName()+"企业提出服务请求");
}
public void visitPersonalCustomer(PersonalCustomer pc) {
// 拿到了个人用户对象的数据
System.out.prinln(pc.getName()+"提出服务请求");
}
}
//ObjectStructure
public class ObjectStructure {
private Collection<Customer> col = new ArrayList<Customer>();
public void handleRequest(Visitor visitor) {
for(Customer cm : col) {
cm.accept(visitor);
}
}
public void addElement(Customer ele) {
this.col.add(ele);
}
}
//client測试
public class Client {
public static void main(String[] args) {
ObjectStructure os = new ObjectStructure();
Customer cm1 = new EnterpriseCustomer();
cm1.setName("ABC集团");
os.addElement(cm1);//加入到os中。以添加新功能
Customer cm2 = new EnterpriseCustomer();
cm2.setName("CDE公司");
os.addElement(cm2);
Customer cm3 = new PersonalCustomer();
cm3.setName("张三");
os.addElement(cm3); ServiceRequestVisitor srVisitor = new ServiceRequestVisitor();
os.handleRequest(srVisitor);
}
}
//以下对如今的功能做扩展,添加一个对客户进行偏好分析的功能,仅仅须要添加一个详细的訪问者即可了
public class PredilectionAnalyzeVisitor implements Visitor {
public void visitEnterpriseCustomer(EnterpriseCustomer ec) {
// 拿到了企业用户对象的数据
System.out.prinln("如今对企业客户-"+ec.getName()+"进行产品偏好分析");
}
public void visitPersonalCustomer(PersonalCustomer pc) {
// 拿到了个人用户对象的数据
System.out.prinln("如今对个人客户-"+pc.getName()+"进行产品偏好分析");
}
}
//在client的使用与请求服务方法一样
//PredilectionAnalyzeVisitor paVisitor = new PredilectionAnalyzeVisitor();
//os.handleRequest(paVisitor); //总结
//这个模式中用到了二次分发技术,跟tcp协议的三次握手有些类似。首先请求拿到对方的控制权。对方进行接受,然后開始使用控制权
//訪问者模式本质:预留通路,回调实现
//长处:扩展性好,复用性好,分离无关行为
//缺点:对象结构变化非常困难,破坏封装(被内部数据开放给了訪问者)
//何时使用訪问者模式:
//1.假设想对一个对象结构实施一系列依赖于对象结构中详细类的操作
//2.假设相对一个对象结构中的各个元素进行非常多不同并且不相关的操作,为了避免这些操作使类变得杂乱,能够使用
//3.假设对象结构非常少变动,可是须要常常给对象结构中的元素对象定义新的操作
//思考:
//感觉能够给全部的对象都使用这个模式,这样扩展起来岂不是非常方便?
//总感觉这个模式怪怪的,可能是这个样例本身的问题吧。看了下其它的样例,感觉这个样例非常不好。 还有一个样例是測试两种种子(Element)在多种不同环境下(Visitor)生长会有何不同

设计模式入门之訪问者模式Visitor的更多相关文章

  1. 设计模式之二十四:訪问者模式(Visitor)

    訪问者模式: 定义了一个作用于一个类的一些操作,訪问者模式同意在不改变类的前提下添加一些操作. Represent an operation to be performed on the elemen ...

  2. 《Java设计模式》之訪问者模式

    訪问者模式是对象的行为模式.訪问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作须要改动的话,接受这个操作的数据结构则能够保持不变. 分派的概念 变量被声明时的类型叫做变量的静态类 ...

  3. JAVA设计模式之:訪问者模式

    訪问者模式: 一个作用于某对象结构中各元素的操作,使你能够在不改变各元素类数据结构的前提下添加作用于这些元素的新操作. 结构对象是訪问者模式必备条件.且这个结构对象必须存在遍历自身各个对象的方法. 适 ...

  4. 设计模式之十五:訪问者模式(Visitor Pattern)

    訪问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式. 据<大话设计模式>中说算是最复杂也是最难以理解的一种模式了. 定义(源于GoF<De ...

  5. JAVA设计模式之 訪问者模式【Visitor Pattern】

    一.概述 訪问者模式是一种较为复杂的行为型设计模式,它包括訪问者和被訪问元素两个主要组成部分.这些被訪问的元素通常具有不同的类型,且不同的訪问者能够对它们进行不同的訪问操作.在使用訪问者模式时,被訪问 ...

  6. Java设计模式(三) Visitor(訪问者)模式及多分派场景应用

    基本概念 Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作能够借助新的visitor实现.减少了操作间的耦合性 訪问者能够将数据结构和对数据的操作解耦,使得添加对数据结构的操作不须要 ...

  7. PHP设计模式——訪问者模式

    声明:本系列博客參考资料<大话设计模式>,作者程杰. 訪问者模式表示一个作用于某对象结构中的各元素的操作. 它使你能够在不改变各元素类的前提下定义作用于这些元素的新操作. UML类图: w ...

  8. C++ 设计模式 —— 訪问者(Visitor)

    訪问者设计模式的实现借助于两个继承体系, (1)elements:一个是被操作的类(基类及其子类) (2)visitors:一个定义了一系列操作的訪问者(基类及其子类) 訪问者模式是一种行为型设计模式 ...

  9. PHP草根论之设计模式-訪问者模式

    关于模式本身的概念,请參考网上其他文章 此处仅仅讨论在PHP实际开发过程中的应用 此模式适用范围极为受限,适用情景: 1.适用于项目维护过程,不适用于项目开发过程 2.新增需求,要求为一个/多个类添加 ...

随机推荐

  1. lfyzoj104 Counting Swaps

    问题描述 给定你一个 \(1 \sim n\) 的排列 \(\{p_i\}\),可进行若干次操作,每次选择两个整数 \(x,y\),交换 \(p_x,p_y\). 请你告诉穰子,用最少的操作次数将给定 ...

  2. 自己项目使用了ARC,项目中使用第三方库继续引用ARC

    Objective-C引入ARC(Automatic Reference Counting)后,我们经常会面对这样一种困境:自己的项目使用了ARC,却发现要使用的第三方类库是non-ARC的:又或者自 ...

  3. .net 操作Access数据库

    using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...

  4. Python基础数据类型之字符串

    Python基础数据类型之字符串 一.Python如何创建字符串 在python中用引号将一些文本包起来就构成了字符串(引号可以是单引号.双引号.单三引号,双三引号,它们是完全相同的) >> ...

  5. 汇编CMOS

    汇编 端口 端口 前面讲过,各种存储器都和CPU的地址线.数据线.控制线相连.CPU在操控它们的时候,把它们都当作内存来对待,把它们总的看做一个由若干存储单元组成的逻辑存储器,这个逻辑器我们称其为内存 ...

  6. nginx的详解(三)

    6.禁止访问某个文件或目录1)禁止访问以txt或doc结尾的文件location ~* \.(txt|doc)${root /data/www/wwwroot/linuxtone/test;deny ...

  7. 安装sqlServer2012失败补救

    今天拿着新电脑win10,装数据库2012,装了第一次,没装上,有一半的工具都失败了,慌了.. 连management studio都没装上,我用navicat也连不上. 卸了,第二次安装,装一半卡住 ...

  8. Codeforces Round #287 (Div. 2) D. The Maths Lecture [数位dp]

    传送门 D. The Maths Lecture time limit per test 1 second memory limit per test 256 megabytes input stan ...

  9. [转发]Android 系统稳定性 - ANR(二)

    文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任. 很久之前写的了,留着有点浪费,共享之.编写者:李文栋P.S. OpenOffice粘贴过来后格式有些混乱. http://rayleeya ...

  10. T1553 互斥的数 codevs

    http://codevs.cn/problem/1553/ 题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y ...