訪問者模式

2021-09-10 15:56:04 字數 3965 閱讀 5293

一、定義

訪問者(visitor)模式:提供乙個作用於某物件結構中的各元素的操作表示,它使得可以在不改變各元素的類的前提下定義作用於這些元素的新操作。訪問者模式是一種物件行為型模式。

二、訪問者模式結構圖

訪問者模式結構圖中包含以下5個角色:

(1)visitor(抽象訪問者):抽象訪問者為物件結構中每乙個具體元素類concreteelement宣告乙個訪問操作,從這個操作的名稱或引數型別可以清楚知道需要訪問的具體元素的型別,具體訪問者則需要實現這些操作方法,定義對這些元素的訪問操作。

(2)concretevisitor(具體訪問者):具體訪問者實現了抽象訪問者宣告的方法,每乙個操作作用於訪問物件結構中一種型別的元素。

(3)element(抽象元素):一般是乙個抽象類或介面,定義乙個accept方法,該方法通常以乙個抽象訪問者作為引數。

(4)concreteelement(具體元素):具體元素實現了accept方法,在accept方法中呼叫訪問者的訪問方法以便完成乙個元素的操作。

(5)objectstructure(物件結構):物件結構是乙個元素的集合,用於存放元素物件,且提供便利其內部元素的方法。

三、示例

background:m公司開發部想要為某企業開發乙個oa系統,在該oa系統中包含乙個員工資訊管理子系統,該企業包括正式員工和臨時工,每週hr部門和財務部等部門需要對員工資料進行彙總,彙總資料報括員工工作時間、員工工資等等。該企業的基本制度如下:

(1)正式員工(full time employee)每週工作時間為40小時,不同級別、不同部門的員工每週基本工資不同;如果超過40小時,超出部分按照100元/小時作為加班費;如果少於40小時,所缺時間按照請假處理,請假鎖扣工資以80元/小時計算,直到基本工資扣除到0為止。除了記錄實際工作時間外,hr部需要記錄加班時長或請假時長,作為員工平時表現的一項依據。

(2)臨時員工(part time employee)每週工作時間不固定,基本工資按照小時計算,不同崗位的臨時工小時工資不同。hr部只需要記錄實際工作時間。

hr人力資源部和財務部工作人員可以根據各自的需要對員工資料進行彙總處理,hr人力資源部負責彙總每週員工工作時間,而財務部負責計算每週員工工資。

抽象元素=>iemployee 

/// /// 抽象元素類:employee

///

public inte***ce iemployee

具體元素=>fulltimeemployee,parttimeemployee 

/// /// 具體元素類:fulltimeemployee

///

public class fulltimeemployee : iemployee

public double weeklywage

public int worktime

public fulltimeemployee(string name, double weeklywage, int worktime)

public void accept(department handler)

}/// /// 具體元素類:parttimeemployee

///

public class parttimeemployee : iemployee

public double hourwage

public int worktime

public parttimeemployee(string name, double hourwage, int worktime)

public void accept(department handler)

}

物件結構=>employeelist

/// /// 物件結構類:employeelist

///

public class employeelist

public void accept(department handler)

}

抽象訪問者=>department

/// /// 抽象訪問者類:department

///

public abstract class department

具體訪問者=>financedepartment,hrdepartment

/// /// 具體訪問者類:financedepartment

///

public class financedepartment : department

實際工資為: 元", employee.name, worktime * hourwage);

}// 實現財務部對全職員工資料的訪問

public override void visit(fulltimeemployee employee)

else if (worktime < 40)

}console.writeline("正式員工 實際工資為: 元", employee.name, weekwage);}}

/// /// 具體訪問者類:hrdepartment

///

public class hrdepartment : department

實際工作時間為: 小時", employee.name, worktime);

}// 實現人力資源部對全職員工資料的訪問

public override void visit(fulltimeemployee employee)

實際工作時間為: 小時", employee.name, worktime);

if (worktime > 40)

加班時間為: 小時", employee.name, worktime - 40);

}else if (worktime < 40)

請假時間為: 小時", employee.name, 40 - worktime);}}

}

客戶端呼叫與測試

public class program

console.readkey();}}

<?xml version="1.0" encoding="utf-8" ?>

catch (exception ex)

return factoryname;

}public static object getdeptinstance()

}編譯執行後的結果如下:

四、訪問者模式優缺點

(1)增加新的訪問操作十分方便,不痛不癢 =>符合開閉原則

(2)將有關元素物件的訪問行為集中到乙個訪問者物件中,而不是分散在乙個個的元素類中,類的職責更加清晰 =>符合單一職責原則

(1)增加新的元素類很困難,需要在每乙個訪問者類中增加相應訪問操作** =>違背了開閉原則

(2)元素物件有時候必須暴露一些自己的內部操作和狀態,否則無法供訪問者訪問 =>破壞了元素的封裝性

(1)乙個物件結構包含多個型別的物件,希望對這些物件實施一些依賴其具體型別的操作。=> 不同的型別可以有不同的訪問操作

(2)物件結構中物件對應的類很少改變很少改變很少改變(重要的事情說三遍),但經常需要在此物件結構上定義新的操作。

訪問者模式

訪問者模式 visitor pattern 訪問者模式是物件的行為模式。訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作。一旦這些操作需要修改的話,接受這個操作的資料結構則可以保持不變。一 問題 集合是大多數的系統都要處理的一種容器物件,它儲存了對其它物件的引用。一般情況下,在集合上採取的...

訪問者模式

行為模式中的訪問者模式 訪問者模式是物件的行為模式。訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作,一旦這些操作需要修改的話,接受這個操作的資料結構則可以保持不變。動機 類層次結構中可能經常由於引入新的操作,從而將型別變得脆弱。在軟體構建過程中,由於需求的改變,某些類層次結構中常常需要增...

訪問者模式

1.說明 namespace visitorspattern 象棋類 public abstract class chess public class redchess chess public class blackchess chess 在贏的情況下的狀態 public class win ac...