設計模式之略見一斑 Visitor訪問者模式

2021-08-25 01:40:36 字數 2225 閱讀 1974

在開發中,我們可能會經常碰到客戶提了一新的需求,那麼在現有的類實現新的需求呢?通常的做法是新增新的方法。但是有時候我們只能看到介面,而根本無法看到其介面實現。這個時候我們就無法往介面裡新增接的方法。但是,開發人員能夠多大設計的時候採用visitor模式的話,結果就大不一樣了。

visitor模式就是讓**使用者能夠在不修改現有類層次結構的情況下,定義該類層次結構的操作。

例子:關於訪問者模式的je上的例子比較多,而且爭議也比較大。下面就舉出個常見的visitor模式的例子,歡迎拍磚。

如乙個公司裡有老闆,經理,員工三種角色,每個角色都繼續human這個類,對於human這個類,我們定義為抽象的

public abstract class human 

public void setlist(list<? extends human> list)

public int getid()

public void setid(int id)

public void accept(visitor visitor)

}

其三種角色都繼續這個human類:

public class boss extends human 

@override

public void accept(visitor visitor)

public string tostring()

}public class manager extends human

@override

public void accept(visitor visitor)

public string tostring()

}public class employee extends human

@override

public void accept(visitor visitor)

public string tostring()

}

在我們構造這些公司的成員時, 我假設用如下方法構造:

boss boss = new boss(1);

listmanagers = new arraylist();

for(int i =2;i<10;i++)else

}return null;

} else

}

但是我們想用訪問者模式來實現它,於是我們定義乙個訪問者介面:

/**

* 訪問員工介面

* @author administrator

* */

public inte***ce visitor

介面實現如下:

public class findvisitor implements visitor

} public void visit(human human)

list<? extends human> list = human.getlist();

for(human e:list)

} public human find(human mc,int id)

}

下面做一下簡單的測試吧:

findvisitor fv =new findvisitor();

human human = fv.find(boss, 20);

system.out.println("find:"+ human);

小結:

訪問者模式可以讓我們在不改變類層次結構中的類的情況下,為該類層次結構定義新的操作。如上面的例子,如果想新增新的需求,如要找某個員工號,並修改員工資訊,於是我們可以新增介面方法,並新增實現。在類層次結構中新增訪問器將呼叫accept()方法,accept()方法通過採用」兩次分開「技術將呼叫結果返回給訪問器類。visit()方法定義在訪問器類中,類層次結構中的某個類物件可以根據其型別呼叫合適的visti()方法。

訪問器類的開發人員必須清楚將要訪問的類層次結構的全部或者部分設計細節。另外,在設計訪問器類的時候,我們必須特別注意被訪問的物件模型中可能會出現環狀結構。考慮到這些問題, 一些開發人員常常會有意避免使個訪問者框框。習慣地使用其他方案替換。一般而言,軟體開發團隊需要根據自己所採用的軟體開發方法學,根據專案組以及具體專案的具體情況使用訪問者模式 。

設計模式之略見一斑 外觀模式Facade

外觀模式又稱門面模式,它是為了給子系統中提供乙個一致的介面,從面定義了乙個高層介面 這個介面使得這一子系統更加容易使用。定義中提到的子系統指在設計中為了降低複雜性根據一定的規則,對系統進行的劃分,子系統封裝有一些類,客戶程式在使用子系統的時候,可能會像下圖一樣零亂。上面的實現中,客戶緊緊依賴在子系統...

設計模式之略見一斑 建造模式builder

建造模式是將複雜的內部建立封裝在內部,對於外部呼叫的人來說,只需要傳入建造者和建造工具,對於內部是如何建造成成品的,呼叫者無需關心。建造模式很象抽象工廠模式,細微的區別的大概只有在反覆使用的方能體會。舉個簡單的例子,如汽車,有很多部件,車輪,方向盤,發動機還有各種小零件等等,部件很多,但遠不止這些,...

設計模式之略見一斑 單例模式singleton

單例模式是屬於比較常用的一例,乙個類 class 在記憶體中只有乙個例項。常用方式如下 第一種 餓漢式 public class singleton 在自己內部定義自己乙個例項,是不是很奇怪?注意這是private 只供內部呼叫 private static singleton instance n...