C#設計模式之訪問者模式
前言
這不是一個特別常用的模式。不做太多介紹,以後學到再補充吧~
訪問者模式
表示一個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。
應用
適用於資料結構相對穩定的系統,它把資料結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由的演化。如果系統有比較穩定的資料結構,又有易於變化的演算法,使用訪問者模式比較合適
目的是要把處理從資料結構分析出來。
訪問者模式的能力和複雜性是把雙刃劍,只有當真正需要用它的時候,才考慮使用。不要誤用或濫用。
優點:增加新的操作容易
缺點:使增加新的資料結構變困難了
程式碼展示
抽象狀態類與抽象人類
//“狀態”的抽象類
abstract class Action
{
//得到男人結論或反應
public abstract void GetManConclusion(Man concreteElementA);
//得到女人結論或反應
public abstract void GetWomanConclusion(Woman concreteElementB);
}
//“人”的抽線類
abstract class Person
{
//接受
public abstract void Accept(Action visitor);//用來獲得“狀態”物件
}
具體狀態類
//成功時
class Success:Action
{
public override void GetManConclusion(Man concreteElementA)
{
Console.WriteLine("{0}{1}時,背後多半有一個偉大的女人。",concreteElementA .GetType ().Name ,this.GetType ().Name );
}
public override void GetWomanConclusion(Woman concreteElementB)
{
Console.WriteLine("{0}{1}時,背後多半有一個不成功的男人。", concreteElementB.GetType().Name, this.GetType().Name);
}
}
//失敗時
class Failing : Action
{
public override void GetManConclusion(Man concreteElementA)
{
Console.WriteLine("{0}{1}時,背後多半有一個偉大的女人。", concreteElementA.GetType().Name, this.GetType().Name);
}
public override void GetWomanConclusion(Woman concreteElementB)
{
Console.WriteLine("{0}{1}時,背後多半有一個不成功的男人。", concreteElementB.GetType().Name, this.GetType().Name);
}
}
//戀愛時。。。。
//需要什麼狀態只要新增類即可,
具體人類:
//男人類
class Man:Person
{
public override void Accept(Action visitor)
{
visitor.GetManConclusion(this);
}
}
//女人類
class Woman:Person
{
public override void Accept(Action visitor)
{
visitor.GetWomanConclusion(this);
}
}
物件結構:
//物件結構
class ObjectStructure
{
private IList<Person> elements = new List<Person>();
//增加
public void Attach(Person element)
{
elements.Add(element);
}
//移除
public void Detach(Person element)
{
elements.Remove(element);
}
//檢視顯示
public void Display(Action visitor)//遍歷方法
{
foreach (Person e in elements)
{
e.Accept(visitor);
}
}
}
客戶端程式碼:
class Program
{
static void Main(string[] args)
{
ObjectStructure o = new ObjectStructure();
o.Attach(new Man()); //在物件結構中加入要對比的男人和女人
o.Attach(new Woman());
Success v1 = new Success(); //檢視在各種狀態下,男人和女人的反應
o.Display(v1);
Failing v2 = new Failing();
o.Display(v2);
Console.Read();
}
}
效果圖:
想要新增什麼狀態,只需新增類即可,也完美的詮釋了開放-封閉原則
後記
原來女人真的是個不講道理的動物呢,不管在什麼狀態下,女人都必須是要佔上風的~
小夥子們注意了~~
相關文章
- JAVA設計模式之訪問者模式Java設計模式
- PHP設計模式之訪問者模式PHP設計模式
- 設計模式學習之訪問者模式設計模式
- 【趣味設計模式系列】之【訪問者模式】設計模式
- 23種設計模式之訪問者模式設計模式
- C#設計模式系列:訪問者模式(Visitor)C#設計模式
- 設計模式:訪問者模式設計模式
- 15.java設計模式之訪問者模式Java設計模式
- 設計模式(十六)——訪問者模式設計模式
- JAVA設計模式之 訪問者模式【Visitor Pattern】Java設計模式
- 極簡設計模式-訪問者模式設計模式
- 設計模式解密(22)- 訪問者模式設計模式解密
- Java進階篇設計模式之十 ---- 訪問者模式和中介者模式Java設計模式
- Android理解設計模式之組合模式、迭代器模式、訪問者模式Android設計模式
- 設計模式 - ASM 中的訪問者模式設計模式ASM
- 18、Python與設計模式–訪問者模式Python設計模式
- 設計模式(二十):訪問者模式、迭代器模式、觀察者模式、原型模式、模板方法設計模式原型
- 設計模式--訪問者模式Visitor(行為型)設計模式
- 設計模式(二十三)訪問者設計模式
- 「補課」進行時:設計模式(18)——訪問者模式設計模式
- 設計模式學習-使用go實現訪問者模式設計模式Go
- 設計模式的征途—16.訪問者(Visitor)模式設計模式
- C#設計模式之命令模式C#設計模式
- C#設計模式(17)——觀察者模式C#設計模式
- C#設計模式(16)——中介者模式C#設計模式
- C#設計模式之中介者模式C#設計模式
- 設計模式之建造者模式設計模式
- 設計模式之觀察者模式設計模式
- 設計模式之-觀察者模式設計模式
- 設計模式之【建造者模式】設計模式
- 設計模式之【觀察者模式】設計模式
- 訪問者模式模式
- 軟體設計模式學習(二十七)訪問者模式設計模式
- 軟體設計模式系列之二十五——訪問者模式設計模式
- C#設計模式-建造者模式(Builder Pattern)C#設計模式UI
- C#設計模式系列:建造者模式(Builder)C#設計模式UI
- C#設計模式系列:觀察者模式(Observer)C#設計模式Server
- C#設計模式之單例模式C#設計模式單例