访问者模式(Visitor)

原创 2013年12月02日 21:10:56
@@@模式定义:
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下
定义作用于这些元素的新操作。

@@@练习示例: 
扩展客户管理的功能

@@@示例代码:
\pattern\Customer.java

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

public abstract class Customer {
    private String customerId;
    private String name;
    
	public String getCustomerId() {
		return customerId;
	}
	
	public void setCustomerId(String customerId) {
		this.customerId = customerId;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
    
	/**
	 * 接受访问者的访问
	 * @param visitor 访问者对象
	 */
    public abstract void accept(Visitor visitor);
}

\pattern\Visitor.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

/**
 * 访问者接口 
 */
public interface Visitor {
	/**
	 * 访问企业客户,相当于给企业客户添加访问者的功能
	 * @param ec 企业客户的对象
	 */
    public void visitEnterpriseCustomer(EnterpriseCustomer ec);
    
    /**
     * 访问个人客户,相当于给个人客户添加访问者的功能
     * @param pc 个人客户的对象
     */
    public void visitPersonalCustomer(PersonalCustomer pc);
}

\pattern\EnterpriseCustomer.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

public class EnterpriseCustomer extends Customer {
    private String linkman;
    private String linkTelephone;
    private String registerAddress;
    
	public String getLinkman() {
		return linkman;
	}

	public void setLinkman(String linkman) {
		this.linkman = linkman;
	}

	public String getLinkTelephone() {
		return linkTelephone;
	}

	public void setLinkTelephone(String linkTelephone) {
		this.linkTelephone = linkTelephone;
	}

	public String getRegisterAddress() {
		return registerAddress;
	}

	public void setRegisterAddress(String registerAddress) {
		this.registerAddress = registerAddress;
	}

	@Override
	public void accept(Visitor visitor) {
		// 回调访问者对象的相应方法
        visitor.visitEnterpriseCustomer(this);
	}
}

\pattern\PersonalCustomer.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

public class PersonalCustomer extends Customer {
    private String telephone;
    private String age;
    
	public String getTelephone() {
		return telephone;
	}

	public void setTelephone(String telephone) {
		this.telephone = telephone;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	@Override
	public void accept(Visitor visitor) {
		// 回调访问者对象的相应方法
        visitor.visitPersonalCustomer(this);
	}
}

\pattern\ServiceRequestVisitor.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

/**
 * 具体的访问者,实现客户提出服务请求的功能
 */
public class ServiceRequestVisitor implements Visitor {
	@Override
	public void visitEnterpriseCustomer(EnterpriseCustomer ec) {
		// 企业客户提出的具体服务请求
        System.out.println(ec.getName() + "企业提出服务请求");
	}

	@Override
	public void visitPersonalCustomer(PersonalCustomer pc) {
		// 个人客户提出的具体服务请求
		System.out.println("客户" + pc.getName() + "提出服务请求");
	}
}

\pattern\PredilectionAnalyzeVisitor.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

/**
 * 具体的访问者,实现对客户的偏好分析
 */
public class PredilectionAnalyzeVisitor implements Visitor {
	@Override
	public void visitEnterpriseCustomer(EnterpriseCustomer ec) {
		// 根据以往购买的历史、潜在购买意向
		// 以及客户所在行业的发展趋势、客户的发展预期等的分析
        System.out.println("现在对企业客户" + ec.getName() + "进行产品偏好分析");
	}

	@Override
	public void visitPersonalCustomer(PersonalCustomer pc) {
		System.out.println("现在对个人客户" + pc.getName() + "进行产品偏好分析");
	}
}

\pattern\ObjectStructure.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

import java.util.ArrayList;
import java.util.Collection;

public class ObjectStructure {
    /**
     * 要操作的客户集合
     */
	private Collection<Customer> col = new ArrayList<Customer>();
	
	/**
	 * 提供给客户端操作的高层接口,具体的功能由客户端传入的访问者决定
	 * @param visitor 客户端需要使用的访问者
	 */
	public void handleRequest(Visitor visitor) {
		// 循环对象结构中的元素,接受访问
		for (Customer cm : col) {
			cm.accept(visitor);
		}
	}
	
	/**
	 * 组建对象结构,向对象结构中添加元素
	 * 不同的对象结构有不同的构建方式
	 * @param ele 加入到对象结构中的元素
	 */
	public void addElement(Customer ele) {
		this.col.add(ele);
	}
}

\user\Client.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package user;

import pattern.Customer;
import pattern.EnterpriseCustomer;
import pattern.ObjectStructure;
import pattern.PersonalCustomer;
import pattern.PredilectionAnalyzeVisitor;
import pattern.ServiceRequestVisitor;

public class Client {
	public static void main(String[] args) {
        // 创建ObjectStructure
		ObjectStructure os = new ObjectStructure();
		// 准备些测试数据,创建客户对象,并加入ObjectStructure
		Customer cm1 = new EnterpriseCustomer();
		cm1.setName("ABC集团");
		os.addElement(cm1);
		
		Customer cm2 = new EnterpriseCustomer();
		cm2.setName("CDE公司");
		os.addElement(cm2);
		
		Customer cm3 = new PersonalCustomer();
		cm3.setName("张三");
        os.addElement(cm3);
        
        // 客户提出服务请求,传入服务请求的Visitor
        ServiceRequestVisitor srVisitor =
            new ServiceRequestVisitor();
        os.handleRequest(srVisitor);
        
        // 要对客户进行偏好分析,传入偏好分析的Visitor
        PredilectionAnalyzeVisitor paVisitor = 
        	new PredilectionAnalyzeVisitor();
        os.handleRequest(paVisitor);
	}
}

@@@运行结果:
ABC集团企业提出服务请求
CDE公司企业提出服务请求
客户张三提出服务请求
现在对企业客户ABC集团进行产品偏好分析
现在对企业客户CDE公司进行产品偏好分析
现在对个人客户张三进行产品偏好分析

@@@模式的实现:
有一个调用回路,进行了两次分发。

@@@模式的优点:
好的扩展性;
好的复用性;
分离无关行为;

@@@模式的缺点:
对象结构变化很困难;
破环封装;

@@@模式的本质:
预留通路,回调实现。

@@@模式体现的设计原则:
NA


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

基本概念Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作可以借助新的visitor实现,降低了操作间的耦合性 访问者可以将数据结构和对数据的操作解耦,使得增加对数据结构的操作不需要取...
  • qq_24451605
  • qq_24451605
  • 2016年04月14日 15:32
  • 5194

JAVA设计模式之 访问者模式【Visitor Pattern】

一、概述     访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。在使用访问者...
  • l416112167
  • l416112167
  • 2014年11月15日 22:21
  • 3332

设计模式(行为型)之访问者模式(Visitor Pattern)

访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。访问者模式使得用户可以在不修改现有系...
  • yanbober
  • yanbober
  • 2015年05月06日 17:11
  • 3224

我所理解的设计模式(C++实现)——访问者模式(Visitor Pattern)

我们去银行柜台办业务,一般情况下会开几个个人业务柜台的,你去其中任何一个柜台办理都是可以的。我们的访问者模式可以很好付诸在这个场景中:对于银行柜台来说,他们是不用变化的,就是说今天和明天提供个人业务的...
  • LCL_data
  • LCL_data
  • 2013年09月12日 16:07
  • 18411

JAVA设计模式十四--Visitor(访问者模式)

访问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式。 据《大话设计模式》中说算是最复杂也是最难以理解的一种模式了。    定义(源于GoF《Design...
  • hfmbook
  • hfmbook
  • 2012年06月22日 10:20
  • 8925

访问者模式(Visitor Pattern)的c++实现示例

访问者模式是一种分离对象数据结构与行为的方法,通过这种分离,可以为一个已存在的类或类群(即被访问者)增加新的操作(即访问者)而无需为它们作任何修改。访问者模式属于行为型模式。 为什么要使用访问者模式?...
  • hityct1
  • hityct1
  • 2009年05月09日 23:47
  • 6262

设计模式总结之Visitor Pattern(访问者模式)

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。...
  • cooldragon
  • cooldragon
  • 2016年08月12日 12:10
  • 4103

C++设计模式实现--访问者(Visitor)模式

一. 访问者模式 定义:表示一个作用于某对象结构中的各元素的操作。它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 结构如下: 二. 举例 假设有一项...
  • L_Andy
  • L_Andy
  • 2014年07月04日 16:12
  • 1259

浅谈JAVA设计模式之——访问者模式(Visitor)

一、概述 表示一个作用于某对象结构中的各元素的操作。 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 二、适用性 1.一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实...
  • l1028386804
  • l1028386804
  • 2015年05月09日 14:27
  • 1071

观察者模式(Observer),责任链模式,访问者模式(Visitor)

概念:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。行为型模式。 main(), IObservable,被观察者接口 CHan...
  • tianyucad123
  • tianyucad123
  • 2016年08月13日 20:10
  • 1133
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:访问者模式(Visitor)
举报原因:
原因补充:

(最多只允许输入30个字)