一、引言
上篇部落格中與大家分享了責任鏈模式,責任鏈模式主要應用於系統中某個功能需要多個參與者完成的場景,今天將分享我對訪問者模式的理解
二、訪問者模式
定義:表示乙個作用於某物件結構中的各元素的操作,它使你可以在不改變各元素類的前提下定義作用於這些元素的新操作
下面是訪問者模式結構圖:
場景:人有男女兩個類別,兩者在成功或失敗時外界的評價是不一樣的
下面是**demo
abstractclass
person
set
}public
abstract
void
getconclution();
}class
man : person
背後都有乙個成功的女人");
}else
if (action == "失敗"
) 悶頭喝酒,誰也不用勸");}}
}class
woman : person
背後都有乙個不成功的男人");
}else
if (action == "失敗"
) 眼淚汪汪,誰也勸不了");}}
}class
program
;lstperson.add(mana);
man manb = new
man ;
lstperson.add(manb);
woman womana = new
woman();
womana.action = "成功"
; lstperson.add(womana);
woman womanb = new
woman();
womanb.action = "失敗"
分析:該示例是應該是最容易想到的實現吧,但是當有新的操作作用於男人、女人時就不得不修改man類或者woman類了,違背了「開-閉」原則,我們認為不是好的設計。
下面是大話設計模式模式中例子
//抽象訪問者類, 作用於物件結構各個元素的類
abstract
class
vistor
//抽象元素類 以訪問者為引數
abstract
class
element
class
concretevistora : vistor
被訪問");
}public
override
void
visitconcreteelementb(concreteelementb concreteelementb)
被訪問");}}
class
concretevistorb : vistor
被訪問");
}public
override
void
visitconcreteelementb(concreteelementb concreteelementb)
被訪問");}}
class
concreteelementa : element
public
void
operationa()
");}
}class
concreteelementb:element
public
void
operationb()
");}
}//物件結構類 ,允許訪問者訪問它的元素
分析:上述示例中 將處理從資料結構中分離出來,這時新增加操作時增加乙個新的訪問者就可以了
優點:1.能夠在不修改物件結構中元素的前提下,為物件結構中元素增加新的功能
2.訪問者模式使得有關的行為操作集中到乙個訪問者物件中,而不是分散到乙個個元素類中
3.可以通過訪問者定義整個結構中的通用功能,提高復用性
缺點:1.增加新的元素模擬較困難,每增加乙個新的元素類意味著抽象訪問者類要增加乙個新的抽象操作,並在每乙個具體的訪問者類中增加操作
適用場景:
1.系統有比較穩定的資料結構,而又有易於變化的演算法時,此時可以考慮使用訪問者模式
2.如果一組類中存在相似的操作,為了避免大量重複的**,可以考慮封裝到訪問者類中
3.如果乙個物件存在著與本身物件不相關,或者關係比較弱的操作時,為了避免汙染這個物件,可以考慮把這些操作封裝到訪問者類中
參考:大話設計模式
訪問者模式 物件行為模式
終於到最後乙個模式了,意圖 表示乙個作用於某物件結構中的各元素的操作。它使你可以再不改變各元素的類的前提下定義作用於這些元素的新操作。動機 使用visitor 模式,必須定義兩個類層次 乙個對應於接受操作的元素,另乙個對應於定義對元素的操作的訪問者 visitor 給訪問者類層次增加乙個新的子類即可...
訪問者模式
訪問者模式 visitor pattern 訪問者模式是物件的行為模式。訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作。一旦這些操作需要修改的話,接受這個操作的資料結構則可以保持不變。一 問題 集合是大多數的系統都要處理的一種容器物件,它儲存了對其它物件的引用。一般情況下,在集合上採取的...
訪問者模式
行為模式中的訪問者模式 訪問者模式是物件的行為模式。訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作,一旦這些操作需要修改的話,接受這個操作的資料結構則可以保持不變。動機 類層次結構中可能經常由於引入新的操作,從而將型別變得脆弱。在軟體構建過程中,由於需求的改變,某些類層次結構中常常需要增...