**定義:**訪問者模式(Vistor Pattern),表示一個作用于對象結構中各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。
**類型:**對象行為型模式。
概述:
????????訪問者模式適用的場合比較狹窄,因為它的要求非常嚴。ConcreteElement要求具有一樣的算法接口,并且ConcreteVisitor也要求一樣的接口,這兩點就使得訪問者模式的使用范圍比較窄。在《Head First Design Patterns》中也將訪問者模式列為非常用模式之一。
?????????舉一個例子,有一個倉庫(對象結構),里面儲存不同的電器(元素),如電視、電腦(具體元素),倉庫可以按電器新舊或大小(具體的訪問者)來擺放電器產品。
類圖:

參與者:
1. Client:構建抽象的訪問者以及結構體對象。
1. Storage,具體生成并存儲不同的商品(如Television、Computer)。
1. Goods,抽象商品類。
1. Television、Computer,具體的商品類,對相應的屬性完成賦值。
1. Place,抽象的訪問者類,提供抽象訪問方法。
1. State、Size,具體的訪問者類,根據相應商品屬性來實現具體的擺放方法Put()。
示例代碼:
~~~
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();
}
}
}
~~~
適用性:
1. 一個對象結構包含很多類對象,它們有不同的接口,而你想對這些對象實施一些依賴于其具體類的操作。
1. 需要對一個對象結構中的對象進行很多不同的并且不相關的操作,而你想避免讓這些操作“污染”這些對象的類。
Visitor使得你可以將相關的操作集中起來定義在一個類中。
當該對象結構被很多應用共享時,用Visitor模式讓每個應用僅包含需要用到的操作。
1. 定義對象結構的類很少改變,但經常需要在此結構上定義新的操作。
改變對象結構類需要重定義對所有訪問者的接口,這可能需要很大的代價。
如果對象結構類經常改變,那么可能還是在這些類中定義這些操作較好**???????????????**
優缺點:
1. 優點,完成新的模板方法是不用修改原有代碼,通過添加新代碼完成。
1. 缺點,當使用訪問者模式時,打破了組合模式。
參考資料:
1. 《設計模式——可復用面向對象軟件基礎》
1. 《大話設計模式》
- 前言
- 設計模式六大原則
- 1——創建型模式之簡單工廠模式
- 2——創建型模式之工廠方法模式
- 3——創建型模式之抽象工廠模式
- 4——創建型模式之單例模式
- 5——創建型模式之建造者模式
- 6——創建型模式之原型模式
- 7——結構型模式之適配器模式
- 8——結構型模式之橋接模式
- 9——結構型模式之組合模式
- 10——結構型模式之裝飾者模式
- 11——結構型模式之外觀模式
- 12——結構型模式之享元模式
- 13——結構型模式之代理模式
- 14——行為型模式之職責鏈模式
- 15——行為型模式之命令模式
- 16——行為型模式之解釋器模式
- 17——行為型模式之迭代器模式
- 18——行為型模式之中介者模式
- 19——行為型模式之備忘錄模式
- 20——行為型模式之觀察者模式
- 21——行為型模式之狀態模式
- 22——行為型模式之策略模式
- 23——行為型模式之模板方法模型
- 24——行為型模式之訪問者模式
- 設計模式總結