訪問者(vistor)模式的定義是,作用於某個物件群中各個物件的操作. 它可以使你在不改變這些物件本身的情況下,定義作用於這些物件的新操作。
假設有男人和女人兩種元素,要分別列印出他們在不同狀態時的不同表現。 用oo的思想把表現(行為)提取出來作為乙個抽象方法,**如下:
public inte***ce person
public class man implements person
else if(state == "love")
}
}public class woman implements person
else if(state == "love")
}
}
當需求發生變化時,要增加一種失敗狀態時,增加男人女人的不同表現,這時就要修改man類與woman類的if else,違反了ocp原則(對增加開放-對修改封閉)。而且隨著需求的增加,man類與woman類的if,else越來越臃腫,需要取消時,又要去修改if,else,既不方便,又容易出錯。 這時候訪問者模式可以派上用場了。
把狀態抽象出來成為乙個介面(訪問者),不同的狀態就作為狀態的不同實現類(不同的訪問者)。
public inte***ce visitor
//成功時man與woman的不同表現
public class success implements visitor
public void visit(woman woman)
}
public class love implements visitor
public void visit(woman woman)
}
被訪問的person類也要改一下。
public inte***ce person
public class man implements person
}
public class woman implements person
}
客戶端測試**:
public static void main(string args)
}
經重構後系統類圖如下:
這時如果要增加一種狀態的不同操作,只需要增加乙個具體訪問者,無需要修改具體元素類man與woman。
public class fail implements visitor
public void visit(woman woman)
}
使用了訪問者模式以後,對於原來的類層次增加新的操作,僅僅需要實現乙個具體訪問者角色就可以了,而不必修改整個類層次,使得類層次結構的**臃腫難以維護。而且這樣符合「開閉原則」的要求。而且每個具體的訪問者角色都對應於乙個相關操作,因此如果乙個操作的需求有變,那麼僅僅修改乙個具體訪問者角色,而不用改動整個類層次。
但是開閉原則的遵循有時也是片面的。如果系統中的類層次發生了變化,你必須修改訪問者介面和每乙個具體訪問者。因此訪問者模式適用於資料結構相對穩定的系統。
訪問者模式的目的是要把處理從資料結構分離出來。很多系統可以按照演算法和資料結構分開,如果這樣的系統有比較穩定的資料結構,又有易於變化的演算法的話,使用訪問者模式是比較合適的,因為訪問者模式使得演算法操作的增加變得容易。反之,如果這樣的系統的資料結構物件易於變化,經常要有新的資料物件增加進來,就不適合使用訪問者模式。
總結一下,訪問者模式適合處理集合中存在大量元素,且元素型別相對固定的場景。
訪問者模式
訪問者模式 visitor pattern 訪問者模式是物件的行為模式。訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作。一旦這些操作需要修改的話,接受這個操作的資料結構則可以保持不變。一 問題 集合是大多數的系統都要處理的一種容器物件,它儲存了對其它物件的引用。一般情況下,在集合上採取的...
訪問者模式
行為模式中的訪問者模式 訪問者模式是物件的行為模式。訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作,一旦這些操作需要修改的話,接受這個操作的資料結構則可以保持不變。動機 類層次結構中可能經常由於引入新的操作,從而將型別變得脆弱。在軟體構建過程中,由於需求的改變,某些類層次結構中常常需要增...
訪問者模式
1.說明 namespace visitorspattern 象棋類 public abstract class chess public class redchess chess public class blackchess chess 在贏的情況下的狀態 public class win ac...