1 介紹
Acey:小白,放假了你天天在家干嘛呀讳癌?
小白:天天在家玩呢穿稳,整個(gè)人都頹風(fēng)了。
Acey:這么嚴(yán)重晌坤,那咋們今天去圖書館轉(zhuǎn)轉(zhuǎn)吧逢艘。
小白:好哇好哇。
Acey:不過咋們先..
小白:Stop骤菠,I konw它改, I konw 你又要講設(shè)計(jì)模式了吧,,???,,。
Acey:哈哈商乎,還是你懂我央拖。
訪問者模式:Visitor 模式是行為模式的一種。將訪問者和訪問者所訪問的元素進(jìn)行分離鹉戚,在不改變已有類的情況下增加新的操作鲜戒。
小白:如果拿圖書館舉例的話,其中訪問者就可以是管理員或者是讀者抹凳,而被訪問的元素就是不同分館內(nèi)的書籍對(duì)嗎遏餐?
Acey:可以這么說,不同的管理員可以管理不同的分館赢底,即使在分館不變的情況下失都,我們也可以增加管理員讓其管理多個(gè)分館。
2 實(shí)現(xiàn)
先來看看訪問者模式的類圖
其中:
- Visitor:訪問者角色幸冻,為每一個(gè)具體訪問者角色創(chuàng)建一個(gè)訪問操作接口
- ConcreteVisitor:具體訪問者角色粹庞,實(shí)現(xiàn) Vistor 接口,并實(shí)現(xiàn)獨(dú)自的操作嘁扼。
- Element:元素角色信粮,定義一個(gè)接收訪問者方法,以訪問者作為參數(shù)趁啸。
- ConcreteElement:具體元素角色强缘,實(shí)現(xiàn)Element接口并實(shí)現(xiàn)接收操作督惰。
- ObjectStructure:對(duì)象結(jié)構(gòu)角色,使訪問者能夠訪問到對(duì)應(yīng)的元素旅掂。
具體實(shí)現(xiàn)
第一步:創(chuàng)建Vistor角色
Visitor.class
//訪問者接口
public interface Visitor {
//訪問文化館的接口
public void visitor(Literature literature);
//訪問自然館的接口
public void visitor(Natural natural);
}
第二步赏胚,創(chuàng)建具體的Vistor角色
LiteratureAdmin.class / NaturalAdmin.class
//文化類書籍管理員
public class LiteratureAdmin implements Visitor{
@Override
public void visitor(Literature literature) {
System.out.println("Literature 管理員負(fù)責(zé)管理文化類書籍");
}
@Override
public void visitor(Natural natural) {
}
}
//自然類書籍管理員
public class NaturalAdmin implements Visitor{
@Override
public void visitor(Literature literature) {
// TODO Auto-generated method stub
}
@Override
public void visitor(Natural natural) {
System.out.println("Natural 管理員負(fù)責(zé)管理自然類書籍");
}
}
第三步,創(chuàng)建Element角色
Library.class
//圖書館接口
public interface Library {
public void accept(Visitor visitor);
}
第四步商虐,創(chuàng)建具體的Element角色
Literature.class / Natural.class
//文化館
public class Literature implements Library{
@Override
public void accept(Visitor visitor) {
visitor.visitor(this);
}
}
//自然館
public class Natural implements Library{
@Override
public void accept(Visitor visitor) {
visitor.visitor(this);
}
}
第五步觉阅,創(chuàng)建ObjectStructure
LibraryCon.class
//對(duì)象構(gòu)造角色 -- 訪問者進(jìn)行訪問
public class LibraryCon implements Library {
private Literature literature;
private Natural natural;
public LibraryCon(){
literature = new Literature();
natural = new Natural();
}
@Override
public void accept(Visitor visitor) {
literature.accept(visitor);
natural.accept(visitor);
}
}
第五步,測試
MainClass.class
public class MainClass {
public static void main(String[] args) {
//創(chuàng)建對(duì)象結(jié)構(gòu)角色
LibraryCon con = new LibraryCon();
//具體的訪問者
LiteratureAdmin literatureAdmin = new LiteratureAdmin();
NaturalAdmin naturalAdmin = new NaturalAdmin();
//進(jìn)行訪問
con.accept(naturalAdmin);
con.accept(literatureAdmin);
}
}
這樣就實(shí)現(xiàn)了一個(gè)簡單的訪問者模式秘车,不同的訪問者可以去訪問不同的元素典勇。在元素不改變的情況下,我們?cè)黾右粋€(gè)新的訪問者很容易叮趴,不需要去改變?cè)乇旧砀铙稀5侨绻覀円バ略鲆粋€(gè)元素那么就會(huì)非常困難,不僅需要去改動(dòng)元素本身眯亦,還需要去修改訪問者伤溉。
喜歡的話戳一下喜歡唄。
有什么建議的話希望大家能在下方回復(fù)??
上一篇:《命令模式 - 年年年貨》