定义:访问者模式(Vistor Pattern),表示一个作用于对象结构中各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
类型:对象行为型模式。
概述:
访问者模式适用的场合比较狭窄,因为它的要求非常严。ConcreteElement要求具有一样的算法接口,并且ConcreteVisitor也要求一样的接口,这两点就使得访问者模式的使用范围比较窄。在《Head First Design Patterns》中也将访问者模式列为非常用模式之一。
举一个例子,有一个仓库(对象结构),里面储存不同的电器(元素),如电视、电脑(具体元素),仓库可以按电器新旧或大小(具体的访问者)来摆放电器产品。
类图:
参与者:
示例代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern24
{
abstract class Visitor
{
public abstract void PutTelevision(Television tv);
public abstract void PutComputer(Computer comp);
}
class SizeVisitor : Visitor
{
public override void PutTelevision(Television tv)
{
Console.WriteLine("按商品大小{0}排放", tv.Size);
}
public override void PutComputer(Computer comp)
{
Console.WriteLine("按商品大小{0}排放", comp.Size);
}
}
class StateVisitor : Visitor
{
public override void PutTelevision(Television tv)
{
Console.WriteLine("按商品新旧值{0}排放", tv.State);
}
public override void PutComputer(Computer comp)
{
Console.WriteLine("按商品新旧值{0}排放", comp.State);
}
}
abstract class Goods
{
public abstract void Operate(Visitor visitor);
private int nSize;
public int Size
{
get {return nSize;}
set {nSize = value;}
}
private int nState;
public int State
{
get {return nState;}
set {nState = value;}
}
}
class Television : Goods
{
public override void Operate(Visitor visitor)
{
visitor.PutTelevision(this);
}
}
class Computer : Goods
{
public override void Operate(Visitor visitor)
{
visitor.PutComputer(this);
}
}
class Storage
{
private IList<Goods> list = new List<Goods>();
public void Attach(Goods element)
{
list.Add(element);
}
public void Detach(Goods element)
{
list.Remove(element);
}
public void Operate(Visitor visitor)
{
foreach (Goods e in list)
{
e.Operate(visitor);
}
}
}
class Program
{
static void Main(string[] args)
{
Storage storage = new Storage();
storage.Attach(new Television());
storage.Attach(new Computer());
SizeVisitor v1 = new SizeVisitor();
StateVisitor v2 = new StateVisitor();
storage.Operate(v1);
storage.Operate(v2);
Console.Read();
}
}
}
适用性:
优缺点:
参考资料:
设计模式24——行为型模式之访问者模式,布布扣,bubuko.com
原文:http://blog.csdn.net/feihe0755/article/details/24201329