1 介紹
Acey:小白,放假了你天天在家干嘛呀?
小白:天天在家玩呢,整個(gè)人都頹風(fēng)了。
Acey:這么嚴(yán)重,那咋們今天去圖書(shū)館轉(zhuǎn)轉(zhuǎn)吧。
小白:好哇好哇。
Acey:不過(guò)咋們先..
小白:Stop,I konw, I konw 你又要講設(shè)計(jì)模式了吧,,???,,。
Acey:哈哈,還是你懂我。
訪問(wèn)者模式:Visitor 模式是行為模式的一種。將訪問(wèn)者和訪問(wèn)者所訪問(wèn)的元素進(jìn)行分離,在不改變已有類(lèi)的情況下增加新的操作。
小白:如果拿圖書(shū)館舉例的話,其中訪問(wèn)者就可以是管理員或者是讀者,而被訪問(wèn)的元素就是不同分館內(nèi)的書(shū)籍對(duì)嗎?
Acey:可以這么說(shuō),不同的管理員可以管理不同的分館,即使在分館不變的情況下,我們也可以增加管理員讓其管理多個(gè)分館。
2 實(shí)現(xiàn)
先來(lái)看看訪問(wèn)者模式的類(lèi)圖
其中:
- Visitor:訪問(wèn)者角色,為每一個(gè)具體訪問(wèn)者角色創(chuàng)建一個(gè)訪問(wèn)操作接口
- ConcreteVisitor:具體訪問(wèn)者角色,實(shí)現(xiàn) Vistor 接口,并實(shí)現(xiàn)獨(dú)自的操作。
- Element:元素角色,定義一個(gè)接收訪問(wèn)者方法,以訪問(wèn)者作為參數(shù)。
- ConcreteElement:具體元素角色,實(shí)現(xiàn)Element接口并實(shí)現(xiàn)接收操作。
- ObjectStructure:對(duì)象結(jié)構(gòu)角色,使訪問(wèn)者能夠訪問(wèn)到對(duì)應(yīng)的元素。
具體實(shí)現(xiàn)
第一步:創(chuàng)建Vistor角色
Visitor.class
//訪問(wèn)者接口
public interface Visitor {
//訪問(wèn)文化館的接口
public void visitor(Literature literature);
//訪問(wèn)自然館的接口
public void visitor(Natural natural);
}
第二步,創(chuàng)建具體的Vistor角色
LiteratureAdmin.class / NaturalAdmin.class
//文化類(lèi)書(shū)籍管理員
public class LiteratureAdmin implements Visitor{
@Override
public void visitor(Literature literature) {
System.out.println("Literature 管理員負(fù)責(zé)管理文化類(lèi)書(shū)籍");
}
@Override
public void visitor(Natural natural) {
}
}
//自然類(lèi)書(shū)籍管理員
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é)管理自然類(lèi)書(shū)籍");
}
}
第三步,創(chuàng)建Element角色
Library.class
//圖書(shū)館接口
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)造角色 -- 訪問(wèn)者進(jìn)行訪問(wè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);
}
}
第五步,測(cè)試
MainClass.class
public class MainClass {
public static void main(String[] args) {
//創(chuàng)建對(duì)象結(jié)構(gòu)角色
LibraryCon con = new LibraryCon();
//具體的訪問(wèn)者
LiteratureAdmin literatureAdmin = new LiteratureAdmin();
NaturalAdmin naturalAdmin = new NaturalAdmin();
//進(jìn)行訪問(wèn)
con.accept(naturalAdmin);
con.accept(literatureAdmin);
}
}
這樣就實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的訪問(wèn)者模式,不同的訪問(wèn)者可以去訪問(wèn)不同的元素。在元素不改變的情況下,我們?cè)黾右粋€(gè)新的訪問(wèn)者很容易,不需要去改變?cè)乇旧怼5侨绻覀円バ略鲆粋€(gè)元素那么就會(huì)非常困難,不僅需要去改動(dòng)元素本身,還需要去修改訪問(wèn)者。
喜歡的話戳一下喜歡唄。
有什么建議的話希望大家能在下方回復(fù)??
上一篇:《命令模式 - 年年年貨》