`
gengu
  • 浏览: 86568 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

访问者模式

 
阅读更多

今天在使用dom4j进行xml解析的时候使用到了访问者模式。

它的使用是这样的,由于dom4j的Node接口中定义了一个accept(Visitor visitor)方法,而Node虚类是dom4j中所有的节点的父类,就相当于Object类一样,但是我们对于xml中的节点的访问应该是不一样的,对于属性,我们应当访问属性名和属性值,对于元素我们应当访问元素值和元素名,对于处理指令我们又要使用不一样的方法访问,他们的调用方法不尽相同。

 

为了方便,我们定义了一个访问者接口:Visitor接口;

Visitor接口提供了这样一些方法:

void visit(Document document);
void visit(DocumentType documentType);
void visit(Element node);
void visit(Attribute node);
void visit(CDATA node);
void visit(Comment node);

………………

 可以看到它基本上把所有的元素都考虑到了,就是说它为每一种元素都提供了一种访问方式。

具体实现的算法却是在具体的类中完成的。

 

下面我们来具体说说什么叫做访问者模式

假设有这样一种情况:现在有个外国军官要来访问中国,他想要看中国的武器,当然了中国为了澄清"中国威胁论",当然要给他看了,有两种武器得给他看啊,第一个是核弹头。第二个就当是J20吧。那么怎么给他看呢?他们都属于武器范畴,但是不一样的东西啊。并且不能把核心机密给泄密了呀?那怎么办呢?访问者模式可以帮得上忙了。

 

给每个武器都添加一个可以接受访问的方法accept(这个当然是要放在超类中的),然后具体如何访问则要在访问者中定义了。好吧!请看代码

package com.gengu.访问者模式;

import java.util.Date;

/**
 * 武器类
 * 描述武器的相关信息
 * */
public abstract class Weapon {

	//型号
	private  String name;
	//用途
	private  String UsdFor;
	//出厂日期
	private  Date date;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getUsdFor() {
		return UsdFor;
	}
	public void setUsdFor(String usdFor) {
		UsdFor = usdFor;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	public abstract void accept(Visitor visitor);
}

 两种武器

package com.gengu.访问者模式;
/**
 * J20战斗机
 * */
public class J20 extends Weapon{

	//性能
	private String performance;

	public String getPerformance() {
		return performance;
	}

	public void setPerformance(String performance) {
		this.performance = performance;
	}

	@Override
	public void accept(Visitor visitor) {
		visitor.visit(this);
	}
	
}

package com.gengu.访问者模式;

/**
 * 这里是核弹
 * */
public class Nbomb extends Weapon{
	//核当量
	private String equivalent;

	public String getEquivalent() {
		return equivalent;
	}
	public void setEquivalent(String equivalent) {
		this.equivalent = equivalent;
	}
	@Override
	public void accept(Visitor visitor) {
		visitor.visit(this);
	}
}
  

 然后就是访问者了

package com.gengu.访问者模式;

/**
 * 访问接口
 * */
public interface Visitor {

	/**我可以访问弹头*/
	public void visit(Nbomb nbomb);
	/**还可以访问J-20*/
	public void visit(J20 j20);
	
}

 访问者类的具体接口

package com.gengu.访问者模式;

public class VisitorImpl implements Visitor{
	public void visit(){}

	@Override
	public void visit(Nbomb nbomb) {
		StringBuffer stringBuffer = new StringBuffer();
		stringBuffer.append("武器的名字:"+nbomb.getName()+"\n");
		stringBuffer.append("出厂日期:"+nbomb.getDate()+"\n");
		stringBuffer.append("战略用途:"+nbomb.getUsdFor()+"\n");
		stringBuffer.append("武器的核当量:"+nbomb.getEquivalent());
		System.out.println(stringBuffer.toString());
		
	}

	@Override
	public void visit(J20 j20) {
		StringBuffer stringBuffer = new StringBuffer();
		stringBuffer.append("武器的名字:"+j20.getName()+"\n");
		stringBuffer.append("出厂日期:"+j20.getDate()+"\n");
		stringBuffer.append("战略用途:"+j20.getUsdFor()+"\n");
		stringBuffer.append("武器的核当量:"+j20.getPerformance());
		System.out.println(stringBuffer.toString());
	}

}

 下面是场景类

package com.gengu.访问者模式;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Client {

	public static void main(String[] args) {
		for(Weapon weapon:makeWeapon()){
			weapon.accept(new VisitorImpl());
			System.out.println("================");
		}
		
	}
	public static List<Weapon> makeWeapon(){
		
		List<Weapon> weapons = new ArrayList<Weapon>();
		Nbomb nbomb = new Nbomb();
		nbomb.setDate(new Date());
		nbomb.setEquivalent("4000W");
		nbomb.setName("核弹头");
		nbomb.setUsdFor("威慑");
		weapons.add(nbomb);
		
		J20 j20 = new J20();
		j20.setDate(new Date());
		j20.setName("歼20");
		j20.setPerformance("性能优越");
		j20.setUsdFor("战略打击");
		weapons.add(j20);
		
		return weapons;
	}
	
}

 这样我们就达到了对于核弹头和飞机的不同的处理,访问非常简单。屏蔽了底层的处理。客户端根本不用理会底层是怎么样让他访问的,只需要按照访问者的规则去得到访问结果就可以了。

 

优点:符合单一职责原则,具有优秀的扩展性,灵活性非常高。

 

分享到:
评论
3 楼 侯上校 2012-02-17  
gengu 写道
抖S青年 写道
作为菜鸟,我有点看不懂!

怎么说呢?其实我写写也是给自己看看,就相当于读书笔记一类的东西,至于有的地方写的比较生硬,请见谅了。

访问者模式:封装一些作用于某种数据结构的各个元素操作,它可以在不改变数据结构的前提下定义作用了这些元素新的操作。

上面的例子中,数据结构指的是哪一块呢?
2 楼 gengu 2011-07-30  
抖S青年 写道
作为菜鸟,我有点看不懂!

怎么说呢?其实我写写也是给自己看看,就相当于读书笔记一类的东西,至于有的地方写的比较生硬,请见谅了。
1 楼 抖S青年 2011-07-29  
作为菜鸟,我有点看不懂!

相关推荐

    设计模式C++学习之访问者模式(Visitor)

    访问者模式(Visitor)是一种行为设计模式,它允许在不修改对象结构的前提下向对象结构中的元素添加新的操作。这种模式将算法与数据结构分离,使得算法可以独立于数据结构进行变化,增强了系统的可扩展性。 在C++中...

    访问者模式在实际开发中的Demo

    《访问者模式在实际开发中的应用深度解析》 访问者模式是设计模式中的一种行为模式,它在实际的软件开发中具有重要的应用价值。通过理解并掌握访问者模式,开发者可以更好地实现对象结构中元素的操作,同时保持元素...

    设计模式 访问者模式

    **访问者模式**是一种行为设计模式,它允许在不修改对象结构的情况下添加新的操作。这种模式主要用于处理具有复杂对象结构的情况,使得我们可以对结构中的每个元素执行特定操作,而无需暴露其内部实现。 访问者模式...

    访问者模式Demo

    **访问者模式**是一种设计模式,它在软件工程中用于在不修改对象结构的前提下,为对象添加新的操作或行为。这种模式将数据结构与数据操作分离,使得可以在不改变对象本身的情况下扩展其功能。访问者模式是行为设计...

    访问者模式代码

    访问者模式是一种设计模式,属于行为模式类别,其主要目的是在不修改对象结构的前提下,为对象结构中的元素提供新的操作。这种模式的核心思想是将数据结构与数据操作分离,使得增加新的操作变得容易,同时也避免了对...

    设计模式 - 访问者模式

    **访问者模式** 访问者模式(Visitor Pattern)是一种行为设计模式,它使你能在不修改对象结构的前提下向其添加新的操作。这种模式常用于处理具有相同接口或抽象类的对象结构,使得可以在不改变原有结构的基础上...

    访问者模式例子2

    访问者模式是一种设计模式,它在对象结构中定义了一个访问并操作其元素的接口。这种模式主要用于在不改变对象结构的前提下增加对象的功能。在“访问者模式例子2”中,我们将深入探讨如何利用该模式来扩展系统的行为...

    68丨访问者模式(上):手把手带你还原访问者模式诞生的思维过程1

    【访问者模式】是一种行为设计模式,其主要目的是在不修改已有对象结构的前提下,为对象增加新的操作。这种模式在23种经典设计模式中属于较为复杂的一种,因为它的理解和应用相对困难,可能导致代码可读性和可维护性...

    访问者模式例子

    访问者模式是一种设计模式,属于行为模式类别,它在软件工程中被用来分离对象结构与对这个结构进行操作的行为。这种模式的主要目的是使代码结构更加灵活,同时增加新的操作而无需修改现有对象结构。在“访问者模式”...

    设计模式的访问者模式的例子

    访问者模式是一种软件设计模式,它在对象结构中定义了一个访问者的接口,使得该访问者可以访问该结构中的每一个元素,同时不影响对象结构本身。这种模式的主要目的是将数据操作与数据结构分离,使得数据结构的变化...

    设计模式之访问者模式

    访问者模式是一种软件设计模式,它在对象结构中定义了一个访问者的接口,使得该访问者可以访问该结构中的每一个元素,同时不影响这些元素自身的行为。这种模式的主要目的是将数据操作和业务逻辑分离,使得数据结构...

    设计模式之访问者模式(Visitor)

    **访问者模式(Visitor)详解** 访问者模式是一种行为设计模式,它使你可以在不修改对象结构的情况下,为对象添加新的操作。这种模式的核心在于将数据结构与对这些数据的操作解耦,使得增加新的操作变得容易,同时...

    java设计模式之访问者模式

    访问者模式是一种软件设计模式,它允许在不改变对象结构的情况下,在对象的现有结构上增加新的操作。在Java中,这种模式尤其有用,因为它能够帮助我们保持类的封装性,同时提供了一种灵活的方式来扩展对象的功能。...

    设计模式-访问者模式(讲解及其实现代码)

    **访问者模式详解** 访问者模式是一种行为设计模式,它允许在不修改对象结构的情况下向对象添加新的操作。这种模式的核心思想是将数据结构与算法分离,使得算法可以在不改变对象结构的前提下增加对对象的操作。 在...

    Objective C 访问者模式设计源码

    访问者模式是一种软件设计模式,属于行为模式范畴,它的核心思想是将数据结构与数据操作分离,使得在不修改原有对象结构的情况下,可以为对象添加新的操作。这种模式常用于处理具有复杂对象结构且需要对这些对象进行...

    设计模式之访问者模式Java版本实现

    **访问者模式**是软件设计模式中的一种结构型模式,它允许在不修改对象结构的情况下,在对象上增加新的操作。这种模式将数据结构与数据操作分离,使得代码更易于维护和扩展。 在Java中实现访问者模式,通常包括以下...

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

    **访问者模式(Visitor Pattern)**是一种行为设计模式,它提供了一种在不修改对象结构的情况下增加新操作的方法。这种模式的主要思想是将数据结构与算法分离,使得算法可以在不改变对象结构的情况下独立变化。 在...

    uml 文档 访问者模式

    访问者模式是一种设计模式,主要用于在不修改原有类层次结构的基础上,增加新的操作或功能。在UML(统一建模语言)文档中,访问者模式通常用于表示对象结构中的类如何接受并处理来自访问者的访问请求。这个模式的...

Global site tag (gtag.js) - Google Analytics