在公司上班,一般會有兼職或全職的員工,他們都發工資,上同樣的班,但是工資待遇是有區別的,財務部和人事部過來調查處理的手法也不是一樣的,雖然都是一樣的計算工資待遇,在軟體開發中存在著這樣的一種情況,我們需要處理著像員工一樣的集合,集合中的具體物件是不一樣的,去訪問時處理的手段也不一樣,軟體設計模式中有這麼一樣設計模式可以滿足上述要求,其動機就是以不同的方式去操作複雜物件結構
提供乙個作用於某物件結構中的各元素的操作表示,它使得可以在不改變各元素結構的前提下定義作用於這些元素的新操作,訪問者模式是一種物件行為型模式
(1)、增加新的訪問操作方便,使用訪問者模式,增加新的訪問操作就意味著增加乙個新的具體訪問者類,實現簡單,無須修改**,符合開閉原則
(2)、將有關元素物件的訪問行為集中到乙個訪問者物件中,而不是分散在乙個個的元素類中,類的職責更加清晰,有利於物件結構中元素物件的復用,相同的物件結構可以提供不同的訪問者訪問
(3)、讓使用者可以不修改現有的元素類層次結構的情況下,定義作用於該層次的結構操作
(1)、增加新的元素類很困難,在訪問者模式中,每增加乙個新的元素類都意味著在抽象訪問者角色中增加乙個新的抽象操作,並在每乙個具體訪問者中都將增加相應的具體操作,這就違背了開閉原則
(2)、破壞了封裝,訪問者模式要求訪問者物件並訪問並呼叫每乙個元素物件的操作,這就意味著元素物件有時候必須暴露一些自己的內部操作和內部狀態,否則無法供訪問者訪問
(1)、當乙個物件結構包含著多個型別物件,希望對這些物件實施一些依賴其具體型別的操作。在訪問者中針對每一種具體的型別都提供了乙個訪問操作,不同型別的物件可以有不同的訪問操作
(2)、需要對乙個物件結構中的物件進行很多不同的操作並且不相關的操作,而且需要避免讓這些操作汙染這些物件的類,也不希望在增加新操作時修改這些類,訪問者模式將相關的訪問操作集中起來定義在訪問者類中,物件結構可以被不同的訪問者類所使用,將物件本身的訪問操作分離
(3)、物件結構中物件對應的類很少改變,但經常需要在此物件結構上定義新的操作
目錄結構
員工抽象類
//員工類:抽象元素類
public inte***ce employee
具體員工類
//全職員工類:具體元素類
public class fulltimeemployee implements employee
public fulltimeemployee(string name, double weeklywage, int weektime)
public string getname()
public void setname(string name)
public double getweeklywage()
public void setweeklywage(double weeklywage)
public int getweektime()
public void setweektime(int weektime)
}
public class parttimeemployee implements employee
public string getname()
public void setname(string name)
public double gethourwage()
public void sethourwage(double hourwage)
public int getworktime()
public void setworktime(int worktime)
@override
public void accept(department handler)
}
抽象部門類
//部門類:抽象訪問者類,
public abstract class department
具體訪問者類
//財務部類:具體訪問者類
public class fadepartment extends department else if(worktime<40)
}system.out.println("正式員工"+employee.getname()+"實際工資為"+weekwage+"元");
}@override
//實現財務部對兼職員工的訪問
public void visit(parttimeemployee employee)
}
//人力資源部類:具體訪問者類
public class hrdepartment extends department else if(worktime<40)
}//實現人力資源對兼職員工的訪問
@override
public void visit(parttimeemployee employee)
}
員工列表類
//員工列表類:物件結構
public class employeelist
//遍歷訪問員工集合中的每乙個員工物件
public void accept(department handler)}}
輔助工具類
public class xmlutil catch (exception e) }}
配置檔案
<?xml version="1.0" encoding="utf-8" ?>
com.company.fadepartment
客戶端測試類
public class main
}
設計模式 行為型模式
行為型模式用於描述程式在執行時複雜的流程控制,即描述多個類或物件之間怎樣相互協作共同完成單個物件都無法單獨完成的任務,它涉及演算法與物件間職責的分配。行為型模式分為類行為模式和物件行為模式,前者採用繼承機制來在類間分派行為,後者採用組合或聚合在物件間分配行為。由於組合關係或聚合關係比繼承關係耦合度低...
設計模式(結構型模式 行為型模式)
一 結構型模式 1.介面卡模式 通過乙個具體類把適配者適配到目標介面中,使得原本不相容的那些類可以一起工作。舉個例子 可以把二分查詢和快排 適配者 封裝到乙個dataoperation 目標介面 介面中,再操作adapter 介面卡 來進行操作。adapter quicksort sortobj,b...
行為型模式之十 訪問者模式
訪問者模式 visitor pattern 表示乙個作用於某物件結構中各元素的操作,它使我們可以在不改變各元素的類的前提下定義作用於這些元素的新操作。它是一種物件行為型模式。抽象訪問者為物件結構類中每乙個具體元素類宣告乙個訪問操作,從這個操作的名稱或引數型別可以清楚知道需要訪問的具體元素的型別,具體...