訪問者模式:表示乙個作用於某物件結構中的各個元素的操作。它使得使用者可以在不改變各個元素的類的前提下定義作用於這些元素的新操作。
簡單問題:根據電表顯示的用電量計算使用者的電費
1:抽象訪問者
某個類可能用自己的例項方法操作自己的資料,但在某些設計中,可能要定義作用於類中資料的新操作,而且這個新的操作不應當由該類中的某個例項方法來承擔。
比如,電表有自己顯示電量的方法(用顯示盤顯示),但要定義乙個方法來計算電費,即要定義作用於電量的新操作,顯然這個新的操作不應當由電表來承擔
在實際中,應當由計表員觀察電表的用電量,然後按照有關標準計算出電費
於是定義訪問者介面,以規定具體訪問者使用什麼樣的方法來訪問電表(元素)
//抽象訪問者
//訪問者模式讓乙個稱為訪問者的物件訪問電表
public inte***ce visitor
2:抽象元素
訪問者要訪問元素,那元素要允許訪問者訪問
//抽象元素
//訪問者需要訪問元素,以便觀察元素中的資料
public abstract class ammeterelement
3:具體訪問者
訪問者有很多種,比如家用電費計費員,工業電費計費員,在這裡只實現乙個家用電費的計費員訪問者
//具體訪問者-家用電計費的電表員
public class homeammetervisitor implements visitor
else
return charge;
}}
4:具體元素
模擬電表
public class ammeter extends ammeterelement
// 檢視多少電
@override
public double showelectricamount()
// 設定多少電
@override
public void setelectricamount(double n)
}
主函式
public static void main(string agrs)}
雙重分派:
訪問者模式使用了一種被稱為「雙重分派」的技術,
在訪問者模式中,被訪問者( 即element元素角色element)首先呼叫accept( visitor visitor)方法接收訪問者,
被接收的訪問者 visitor 再呼叫 visit( element element)方法訪問當前 element物件
使用者只需要讓「電表」接收「計表員」,即讓計表員」看到電表上的用電量,就不必關心「計表員」其他的行為了,因為「計表員」會馬上按照有關標準計算電費(生活中也是如此),即「計表員」通過執行visit(電表)方法計算出電費
「雙重分派」技術中的核心是將資料的儲存和操作解除耦合。元素呼叫 accept(訪問者)方法將元素的資料儲存和資料處理解耦。
我的理解是:電表儲存電量(資料),電表讓計費員參與電費的計算,計費員檢視電量計算電費(操作)
當執行元素.accept(訪問者);時候,就會導致訪問者.visit(元素);
優點:(1)在不改變乙個集合中的元素的類的情況下,增加新的施加於該元素上的新操作。
(2)可以將集合中各元素的某些操作集中到訪問者中,不僅便於集合的維護,也有利於集合中元素的復用。
使用情景:
(1)在乙個物件結構中,比如某個集合中,包含有很多物件,想對集合中的物件增加一些新的操作
(2)需要對集合中的物件進行很多不同的並且不相關的操作,而我們又不想修改物件的類,此時就可以使用訪問者模式。訪問者模式可以在 visitor類中集中定義一些關於集合中物件的操作
設計模式 訪問者模式
訪問者模式是一種資料操作與資料結構分離的設計模式,訪問者模式的基本想法是,軟體系統中擁有乙個由許多物件構成的 比較穩定的物件結構,這些物件的類都擁有乙個accept方法用來接受訪問者物件的訪問。訪問者是乙個介面,它擁有乙個visit方法,這個方法對訪問到的物件結構中不同型別的元素作出不同的處理。在物...
設計模式 訪問者模式
訪問者模式 visitor 表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。例子 男人和女人在不同的狀態下會有不同反應,採用訪問者模式,可以增加狀態很方便 抽象狀態類 class action 男人反應 virtual void getwom...
設計模式 訪問者模式
在訪問者模式 visitor pattern 中,我們使用了乙個訪問者類,它改變了元素類的執行演算法。通過這種方式,元素的執行演算法可以隨著訪問者改變而改變。這種型別的設計模式屬於行為型模式。根據模式,元素物件已接受訪問者物件,這樣訪問者物件就可以處理元素物件上的操作。1 符合單一職責原則。2 優秀...