`
wu_quanyin
  • 浏览: 208175 次
  • 性别: Icon_minigender_1
  • 来自: 福建省
社区版块
存档分类
最新评论

访问者模式(Visitor)---集合

阅读更多

一,每一种模式都是为了解决问题而设计的,

需解决的问题:

 

Iterator iterator = collection.iterator()
while (iterator.hasNext()) {
   Object o = iterator.next();
       if (o instanceof StringType)
      System.out.println("'"+o.toString()+"'");
   else if (o instanceof FloatType)
      System.out.println(o.toString()+"");
   else
      System.out.println(o.toString());
}

 

像这种集合中的黑箱操作,迭代出来都要对其判断类型,如果要对集合中添加了其他的类型,还要对其多添加一个判断,这样的操作违反了开闭原则,这种模式就是为了解决这个问题。。。

 

模式实现

 

 

package com.wqy.visitor;
/**
 * 对予以进行逻辑判断的类型进行抽象
 * 
 * @author wu_quanyin(09817)
 * @version 1.0
 * @date Jul 18, 2010 5:30:26 AM
 */
public interface Visitor
{
	public void visitString(StringType string);
	public void visitFloat(FloatType mflat);
}

 对其进行实现。。

 

package com.wqy.visitor;

/**
 * @author wu_quanyin(09817) 
 * @version 1.0
 * @date Jul 18, 2010 5:33:51 AM
 */
public class ConcreteVisitor implements Visitor {
	public void visitString(StringType string) {
		System.out.println("'" + string + "'");
	}

	public void visitFloat(FloatType flat) {
		System.out.println(flat.toString() + "f");
	}
}

 //-------------------------------------------------------------------------------------------------------------------------

对里面拥有的每一个类型进行封装

 

 

package com.wqy.visitor;
/**
 * 
 * @author wu_quanyin(09817)
 * @version 1.0
 * @date Jul 18, 2010 5:32:01 AM
 */
public interface Visitable
{
	public void accept(Visitor visitor);
}

 FloatType

 

package com.wqy.visitor;
/**
 * @author wu_quanyin(09817) 
 * @version 1.0
 * @date Jul 18, 2010 5:32:38 AM
 */
public class FloatType implements Visitable
{
	public FloatType() {
	}
	public void accept(Visitor visitor) {
		visitor.visitFloat(this);
	}
}

 StringType

 

package com.wqy.visitor;

/**
 * @author wu_quanyin(09817) 
 * @version 1.0
 * @date Jul 18, 2010 5:32:38 AM
 */
public class StringType implements Visitable
{
	public StringType() {
	}
	//定义accept的具体内容 这里是很简单的一句调用
	public void accept(Visitor visitor) {
		visitor.visitString(this);
	}
}

 //------------------------------------------------------------------------------------------------

   对以上类的封装

 

package com.wqy.visitor;

import java.util.Enumeration;
import java.util.Vector;

/**
 * @author wu_quanyin(09817) 
 * @version 1.0
 * @date Jul 18, 2010 5:38:29 AM
 */
public class ObjectStructure {

	private Vector typeCollections =new Vector();
	public ObjectStructure(){
	}
	
   /**
    * 只要实现了visitable接口,作弄可任意添加
    * @param object
    */
	public void addType(Object object){
		typeCollections.add(object);
	}
	
	/**
	 * 对添加进的类型进行访问执行
	 * @param vistor
	 */
	public void action(Visitor vistor){
		for(Enumeration e=typeCollections.elements();e.hasMoreElements();){
			Object o=e.nextElement();
				if(o instanceof Visitable)
					((Visitable)o).accept(vistor);
		}
	}
}
 

测试:

 

package com.wqy.visitor;
/**
 * 
 * @author wu_quanyin(09817)
 * @version 1.0
 * @date Jul 18, 2010 5:37:55 AM
 */
public class Client {

	public static void main(String[] args) {
		Visitable floatType=new FloatType();
		Visitable stringType=new StringType();
		ObjectStructure objectStruct=new ObjectStructure();
		objectStruct.addType(floatType);
		objectStruct.addType(stringType);
		
		Visitor visitor=new ConcreteVisitor();
		
		objectStruct.action(visitor);
		
	}
}

 以上的设计,1只要不要对每一个类型进行判断2Visitable是变化的,你若要为集合添加其他的类型,只要实现这个接口,添加进集合就可以了。满足‘开闭原则’,当然如果也要去为vistor添加其实现,但是visitor可以再以接口的形式变的更加灵活,这里就不举例了。。。

 

 

0
0
分享到:
评论

相关推荐

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

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

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

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

    设计模式-访问者(Visitor)模式详解和应用.pdf

    访问者模式(Visitor Pattern)是一种行为型设计模式,它允许我们向一组已存在的类添加新的行为,而无需修改这些类。这种模式的核心思想是在不改变元素类的前提下,通过引入新的访问者来扩展系统的功能。 #### 二、...

    设计模式 - 访问者模式

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

    C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式

    ### C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式 #### 概述 在本篇文章中,我们将深入探讨面向对象设计模式中的一个非常重要的模式——**Visitor(访问者)模式**。此模式属于行为型模式的一...

    软件设计与体系结构-设计模式-访问者模式-ppt制作

    访问者模式(Visitor Pattern)是软件工程领域中一种重要的设计模式,主要用于处理数据结构中元素的操作问题。该模式的核心思想在于将数据操作与数据结构本身相分离,通过这种方式,可以在不改变数据结构的前提下...

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

    在实际开发中,访问者模式常常用于处理具有相似操作但类型不同的对象集合。例如,考虑一个XML解析库,如DOM4J,我们可以创建一个访问者来遍历XML文档的节点,执行不同的操作,如打印节点内容、计算节点深度等。DOM4J...

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

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

    访问者模式(Visitor)原理图

    访问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式。它表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。从定义可以看出,...

    设计模式之访问者模式

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

    Objective C 访问者模式设计源码

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

    3 访问者模式-MOOC课程内容.pdf

    访问者模式是软件设计模式中行为型模式的一种,它是一种能够为对象结构中的对象添加新的操作,而无需改变其类的行为模式。在访问者模式中,将数据操作和数据结构分离,使得增加新的操作变得容易,同时保持了操作的...

    访问者模式例子2

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

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

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

    访问者模式代码

    在实际应用中,访问者模式常用于处理具有复杂结构的对象集合,例如解析XML文档、编译器的语法分析等场景。通过访问者模式,我们可以很容易地添加新的操作,而无需更改现有的元素类。这有助于保持系统的灵活性和可...

    访问者模式例子

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

    java设计模式之访问者模式

    1. **高内聚,低耦合**:访问者模式将操作与数据结构分离,使得操作集合可以独立变化,而数据结构也可以独立变化,两者互不影响。 2. **可扩展性好**:新增新的操作非常方便,只需要增加一个新的访问者类即可。 3....

    Visitor模式

    访问者模式(Visitor Pattern)是一种行为设计模式,它使你能在不修改对象结构的前提下,为对象添加新的操作。这种模式在处理具有复杂逻辑和多种类型的对象结构时特别有用,因为它允许你在不改变原有结构的情况下,...

    visitor-webshop:访问者模式示例

    5. **对象结构(Object Structure)**:持有对象的集合,可以遍历这些对象并接受访问者。它不关心访问者的具体类型,只负责传递访问者给对象。 在这个网店示例中,对象结构可能包括商品(Product)、订单(Order)...

Global site tag (gtag.js) - Google Analytics