訪問者模式

2021-09-24 09:10:53 字數 2076 閱讀 4427

訪問者模式,顧名思義就是遍歷集合時,用來訪問集合中元素的。這個集合中元素的型別不同,但型別都是已知的,且未來不會改變。訪問單個元素的方式有多種,每種方式在訪問不同型別的元素時所做的操作不同,並且未來可能會有新的訪問方式。

舉例來說:

乙個班級裡有學霸和學渣兩種型別的學生。當出成績時,學霸開心,學渣不開心。當放假時,學霸不開心,學渣開心。未來不會有第三種型別的學生,但未來可能會有新的事件發生,比如布置作業、春遊等。

現在要求寫**實現列印放假時和出成績時學生們的反應,**怎麼寫呢?最簡單最容易想到的方法,用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...