訪問者模式,顧名思義就是遍歷集合時,用來訪問集合中元素的。這個集合中元素的型別不同,但型別都是已知的,且未來不會改變。訪問單個元素的方式有多種,每種方式在訪問不同型別的元素時所做的操作不同,並且未來可能會有新的訪問方式。
舉例來說:
乙個班級裡有學霸和學渣兩種型別的學生。當出成績時,學霸開心,學渣不開心。當放假時,學霸不開心,學渣開心。未來不會有第三種型別的學生,但未來可能會有新的事件發生,比如布置作業、春遊等。
現在要求寫**實現列印放假時和出成績時學生們的反應,**怎麼寫呢?最簡單最容易想到的方法,用if語句和instanceof判斷型別,執行不同操作,偽**如下:
abstract class student{} // 抽象學生類
class xueba extends student{} // 學霸
class xuezha extends student{} // 學渣
main; // 班級學生,只有學霸和學渣兩種型別
// 出成績了
for(student s: students)else if(s instanceof xuezha)
}// 放假了
for(student s: students)else if(s instanceof xuezha)
}}
但這樣寫明顯不符合物件導向的開放封閉原則,怎麼改呢?有乙個容易想到的方法,就是把出成績和放假作為乙個抽象方法,寫到抽象學生類裡面,學霸和學渣分別實現這兩個方法(這種做法也不對,後面會說原因):
abstract class student
class xueba extends student
public void releasescore()
}class xuezha extends student
public void releasescore()}
main; // 班級學生,只有學霸和學渣兩種型別
// 出成績了
for(student s: students)
// 放假了
for(student s: students)
}
這樣寫,看上去很符合開放封閉原則,因為如果有新的型別的學生,只需要新增乙個新的學生類,讓它去實現兩個抽象方法即可,不用改其它類的**。
但仔細看題目,題目說不會有新的型別學生,而是會有新型別的事件!
也就是說,如果現在要春遊,就需要在抽象學生類裡加乙個springouting()方法,然後分別在學霸和學渣裡實現。一共需要改三個類!一點也不符合開放封閉原則。
所以一定要搞清楚固定的東西是什麼,可能會變的東西是什麼。
因為會變的是遍歷列表時對學生的訪問方法(出成績、放假、春遊),而不是學生型別(學霸、學渣),所以這裡就不應該像上面那樣將學生的行為抽象,而是應該將訪問的方式抽象:
abstract class student
class xueba extends student
}class xuezha extends student}
abstract class visitor
這樣寫好以後,要新增訪問方法(出成績、放假、春遊),只需要繼承visitor類,並實現學霸和學渣分別不同的反應即可。比如出成績:
class releasescorevisitor extends visitor
public void visitxuezha(xuezha x)
}
主函式:
main(); // 班級學生,只有學霸和學渣兩種型別
visitor v = new releasescorevisitor(); // 先確定訪問方式,「出成績」
for(student s: students)
}
現在要新增訪問方法(放假、春遊等),就只需要新增訪問方式類,而不需要修改上面寫好的類,所以這樣才真正符合開放封閉原則。
在遍歷集合時,把訪問單個物件的方式抽象出來,這就是訪問者模式。
訪問者模式
訪問者模式 visitor pattern 訪問者模式是物件的行為模式。訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作。一旦這些操作需要修改的話,接受這個操作的資料結構則可以保持不變。一 問題 集合是大多數的系統都要處理的一種容器物件,它儲存了對其它物件的引用。一般情況下,在集合上採取的...
訪問者模式
行為模式中的訪問者模式 訪問者模式是物件的行為模式。訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作,一旦這些操作需要修改的話,接受這個操作的資料結構則可以保持不變。動機 類層次結構中可能經常由於引入新的操作,從而將型別變得脆弱。在軟體構建過程中,由於需求的改變,某些類層次結構中常常需要增...
訪問者模式
1.說明 namespace visitorspattern 象棋類 public abstract class chess public class redchess chess public class blackchess chess 在贏的情況下的狀態 public class win ac...