spring 中訪問者模式的使用案例
案例: 現有員工employee, 管理員工managementemployee, 需求,對每個員工增加獎金,每個員工的等級*100,是獎金的演算法,計算每個員工的獎金,與獎金+工資
**示例
員工類
class
employee
public string getname()
public
intgetgrade()
public
intgetsalary()
public
void
setsalary
(int salary)
}
員工管理類
//管理員工資訊類
class
managementemployee
//刪除員工
public
void
detach
(employee employee)
//對每個員工增加獎金的演算法
public
void
bonus()
);}}
客戶端呼叫測試
public
static
void
main
(string[
] args)
分析可能存在的問題: 呼叫managementemployee中的bonus()方法計算員工獎金,假設後續獎金演算法改變了怎麼辦?要根據需求重新修改bonus()方法,違反ocp原則
使用訪問者模式解決問題: 將可能變化的演算法抽取出來,建立出乙個訪問物件,當我們改變獎金演算法時,增加或修改訪問物件即可
什麼叫訪問者: 先了解什麼叫訪問 在資料結構方面來看遍歷就是訪問的一般形式,單獨讀取乙個元素進行相應的處理也叫作訪問,讀取到想要檢視的內容+對其進行處理就叫做訪問,在此處,呼叫獎金演算法方法bonus(),就是一種訪問,將訪問抽取出來建立為乙個可以執行的個體,就是訪問者
訪問者模式: 對於一組物件,在不改變資料結構的情況下(資料結構此處是指employee中各個屬性)增加操作這些結構元素的新功能,把資料結構與運算元據的方法進行解耦(獎金與計算獎金的演算法進行剝離),使操作更加靈活自由
優點 :
單一職責(可能存在多個訪問者,例如多種不同的獎金演算法,每個訪問者只負責一種)
擴充套件性良好,抽象出公共的抽象訪問者介面,後續需要增加其它演算法,實現抽象介面即可
缺點: 固定的資料結構情況下使用,例如employee中的屬性不固定,則不推薦使用
訪問者模式與迭代器模式: 訪問者關注的是儲存在容器中的元素進行某種指定的處理,迭代器模式關注的是對容器中的元素進行逐個遍歷
建立抽象訪問者,建立抽象訪問者原因是便於以後新增其它訪問者,例如後續增加了另外一種獎金演算法,直接實現抽象訪問者即可
//抽象訪問者
inte***ce
visitor
建立具體訪問者,實現訪問方法,也就是employee,計算獎金的方法,抽取出來
//具體訪問者
class
compensationvisitor
implements
visitor
}
建立抽象被訪問者,宣告被宣告型別的訪問者訪問,抽象的原因是便於後續擴充套件,假設,後續還有其他型別的員工,直接繼承即可
//抽象被訪問者
inte***ce
element
建立具體被訪問者,實現抽象訪問者,注意被訪問者與訪問者的互動方法
//具體被訪問者,繼承被訪問者介面
class
employee
implements
element
public string getname()
public
intgetgrade()
public
intgetsalary()
public
void
setsalary
(int salary)
//重點: 重寫接收訪問者方法,接收到訪問者後怎麼操作
//在訪問者中定義訪問方法,而訪問方法要訪問的資料,
//正是當前類物件類物件型別資料(employee是element實現子類)
@override
public
void
accept
(visitor visitor)
}
建立員工管理類,元素容器類
//管理員工資訊類
class
managementemployee
//刪除員工
public
void
detach
(employee employee)
//遍歷容器中被訪問元素,傳遞訪問者物件,呼叫訪問方法
public
void
accept
(visitor visitor)
}
呼叫測試
在 spring ioc中,檢視 beandefinitionvisitor ,bean的訪問者,可以遍歷bean的屬性,使用properties進行填充
訪問者模式
訪問者模式 visitor pattern 訪問者模式是物件的行為模式。訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作。一旦這些操作需要修改的話,接受這個操作的資料結構則可以保持不變。一 問題 集合是大多數的系統都要處理的一種容器物件,它儲存了對其它物件的引用。一般情況下,在集合上採取的...
訪問者模式
行為模式中的訪問者模式 訪問者模式是物件的行為模式。訪問者模式的目的是封裝一些施加於某種資料結構元素之上的操作,一旦這些操作需要修改的話,接受這個操作的資料結構則可以保持不變。動機 類層次結構中可能經常由於引入新的操作,從而將型別變得脆弱。在軟體構建過程中,由於需求的改變,某些類層次結構中常常需要增...
訪問者模式
1.說明 namespace visitorspattern 象棋類 public abstract class chess public class redchess chess public class blackchess chess 在贏的情況下的狀態 public class win ac...