最复杂的设计模式---访问者模式

今天,我们一起来探讨最后一个、最复杂的设计模式 访问者模式;它表示一个作用于某个对象结构中的各个元素的操作。它使你可以在不改变个元素的类前提下,定义作用于这些元素的新操作。这个地方要注意:1.需要有个对象结构类用于存储循环遍历的方法的方式;2.访问者模式是对元素的操作;3.可以任意添加对这些元素的新操作。确实有点复杂,我们先看看其结构图:

代码部分:

Visitor类抽象声明了对各种类型元素的访问方法;

abstract class Visitor
{
	public abstract void VisitConcreteElementA(ConcreteElementA elementA);
	public abstract void VisitConcreteElementB(ConcreteElementB elementB);
}

ConcreteVisitor1 和ConcreteVisitor2 分别定义两种不同访问状态下的对各种元素的实际操作;

class ConcreteVisitor1:Visitor
{
	public override void VisitConcreteElementA(ConcreteElementA elementA)
	{
		Console.WriteLine("1元素{0}被{1}访问",elementA.GetType().Name,this.GetTye().name);
	}
	public override void VisitConcreteElementB(ConcreteElementB elementB)
	{
		Console.WriteLine("1元素{0}被{1}访问",elementB.GetType().Name,this.GetTye().name);
	}
}

class ConcreteVisitor2:Visitor
{
	public override void VisitConcreteElementA(ConcreteElementA elementA)
	{
		Console.WriteLine("2元素{0}被{1}访问",elementA.GetType().Name,this.GetTye().name);
	}
	public override void VisitConcreteElementB(ConcreteElementB elementB)
	{
		Console.WriteLine("2元素{0}被{1}访问",elementB.GetType().Name,this.GetTye().name);
	}
}

Element是对元素的抽象类,声明了元素根据传入的访问状态进行的操作方法;

abstract class Element
{
	public abstract void Accept(Visitor visitor);
}

具体的元素类:ConcreteElementA、ConcreteElementB ;具体的定义了元素访问方式;这个地方我们要提到二次分派的技术。什么是二次分派?就是先方法状态以参数的形式传输给具体的元素类,然后又根据传入的访问状态的方法并将自身以参数的形式传入;

class ConcreteElementA : Element
{
	public override void Accept(Visitor visitor)
	{
	    //这个地方用药2次分派的技术,让操作与数据结构的分离
		visitor.VisitConcreteElementA(this);
	}
	//其他方法的定义
	public void OperationA()
	{
	}
}
class ConcreteElementB : Element
{
	public override void Accept(Visitor visitor)
	{
	    //这个地方用药2次分派的技术,让操作与数据结构的分离
		visitor.VisitConcreteElementB(this);
	}
	//其他方法的定义
	public void OperationB()
	{
	}
}

对象结构类主要用于收集元素、实现传入访问状态后对各个元素的访问;

class ObjectStructure
{
	private IList<Element> list=new List<Element>();
	public void Attach(Element element)
	{
		list.Add(element);
	}
	public void Detach(Element element)
	{
		list.Delete(element);
	}
	public void Accept(Visitor visitor)
	{
		foreach(Element a in list)
		{
			a.Accept(visitor);
		}
	}
}

客户端代码,先组装元素,然后定义访问状态,进行访问;如果我们需要新增加操作,只需要继承Visitor ,并在客户端添加两句代码就可以了;

static void Main(string[] arg)
{
	ObjectStructure o=new ObjectStructure();
	o.Attach(new ConcreteElementA());
	o.Attach(new ConcreteElementB());

	ConcreteVisitor1 v1=new ConcreteVisitor1();
	ConcreteVisitor2 v2=new ConcreteVisitor2();
    o.Accept(v1);
	o.Accept(v2);
	//如果新增加操作则如以下代码
	//ConcreteVisitor3 v3=new ConcreteVisitor3();
    //o.Accept(v3);
}

好了,现在想想啥时候我们用这种模式?一般在数据结构相对比较稳定的时候,我们采用此模式进行编码;这种模式最大的好处在于把数据结构和作用于上的操作直接耦合性降低了;方便我们新增对元素的操作;但是这个设计模式也有弊端:要求数据结构元素的类型必须相对稳定。

时间: 2024-10-12 21:47:32

最复杂的设计模式---访问者模式的相关文章

.NET设计模式访问者模式

一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该对象结构中具体元素角色声明一个访问操作接口.该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它.2.ConcreteVisitor.具体访问者角色,实现Visitor声明的接口.3.Element 定义一个接受访问操作(accept

[我的设计模式] 访问者模式

访问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式. 定义(源于GoF<Design Pattern>):表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 从定义可以看出结构对象是使用访问者模式必备条件,而且这个结构对象必须存在遍历自身各个对象的方法. 应用场景 用户访问博客.[我的设计模式] 访问者模式

【C#设计模式-访问者模式】

一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该对象结构中具体元素角色声明一个访问操作接口.该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它. 2.ConcreteVisitor.具体访问者角色,实现Visitor声明的接口. 3.Element 定义一个接受访问操作(acce

C#设计模式-访问者模式

一.访问者模式介绍 1.1 访问者模式的定义 表示一个作用于某对象结构中的各个元素的操作.它使你可以在不改变各个元素的类的前提下定义作用于这些元素的新操作. 1.2 访问者模式的结构图 具体的访问者模式结构图如下所示. 这里需要明确一点:访问者模式中具体访问者的数目和具体节点的数目没有任何关系.从访问者的结构图可以看出,访问者模式涉及以下几类角色. 抽象访问者角色(Vistor):声明一个活多个访问操作,使得所有具体访问者必须实现的接口. 具体访问者角色(ConcreteVistor):实现抽象

小菜学设计模式——访问者模式

背景 最后一个设计模式,也是<大话设计模式>公认最难的设计模式,当然不是理解上困难,我觉得应该是使用上困难,这个设计模式虽然具有非常良好的扩展能力,但却需要类的结构早早定义清晰,试想,需求时刻变化,你的类可以稳定吗? 1.使用意图 容易扩展,满足开发封闭原则 2.生活实例 男人和女人的状态,把ConcreteElmentA看成男人,把ConcreteElementB看成女人,那么,所有的Visitor实例就是成功状态.失败状态.结婚状态.升职状态等.把这些状态放在客户端的集合中维护,一旦需要,

PHP设计模式——访问者模式

声明:本系列博客参考资料<大话设计模式>,作者程杰. 访问者模式表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. UML类图: 角色: 1.抽象访问者(State):为该对象结构中具体元素角色声明一个访问操作接口.该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它. 2.具体访问者(Success):实现访问者声明的接口. 3.抽象元素(Person):定义一个接受访问操

深入浅出设计模式——访问者模式(Visitor Pattern)

模式动机 对于系统中的某些对象,它们存储在同一个集合中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同,访问者模式为解决这类问题而诞生.在实际使用时,对同一集合对象的操作并不是唯一的,对相同的元素对象可能存在多种不同的操作方式.而且这些操作方式并不稳定,可能还需要增加新的操作,以满足新的业务需求.此时,访问者模式就是一个值得考虑的解决方案.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作,一旦这些操作需要修改的话,接受这

iOS设计模式---访问者模式

一个简单的Car模型,含有1台Engine.4个Wheel,使用访问者模式添加对Car的升级与维修操作. 定义Engine类: // //  NimoEngine.h //  VisitorDemo // //  Created by fu zheng on 15/8/12. //  Copyright (c) 2015年 FuZheng. All rights reserved. // #import <Foundation/Foundation.h> #import "NimoC

C++设计模式——访问者模式

访问者模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.访问者模式把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化.该模式的目的是要把处理从数据结构分离出来.访问者模式让增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者.访问者模式将有关的行为集中到一个访问者对象中.现在再来说说我之前经历过的那个项目. 是基于Wi