今天我們要一起探討的主題是一種設(shè)計(jì)模式——訪問(wèn)者模式(Visitor Pattern)。我將從最基礎(chǔ)的概念、應(yīng)用場(chǎng)景,再到實(shí)例代碼的展示,全方位的為大家剖析訪問(wèn)者模式。而且,我保證,你即使是編程新手,也能理解并開(kāi)始應(yīng)用這個(gè)設(shè)計(jì)模式!
首先,讓我們先看一眼訪問(wèn)者模式的定義:
“訪問(wèn)者模式是一種將數(shù)據(jù)操作與數(shù)據(jù)結(jié)構(gòu)分離的設(shè)計(jì)模式,它允許在不改變數(shù)據(jù)結(jié)構(gòu)的情況下添加新的操作?!?/p>
你可能會(huì)覺(jué)得這個(gè)定義含混不清,不過(guò)別擔(dān)心!接下來(lái)我們將通過(guò)一個(gè)有趣的例子來(lái)了解什么是訪問(wèn)者模式,以及它的作用。
樂(lè)園游客與樂(lè)園設(shè)施
想象一個(gè)場(chǎng)景:你是一位樂(lè)園的游客,樂(lè)園中有各種各樣的設(shè)施,像過(guò)山車(chē)、旋轉(zhuǎn)木馬、摩天輪等等。作為游客,你可以選擇你喜歡的設(shè)施進(jìn)行游玩。
在這個(gè)例子中,游客就像是“訪問(wèn)者”,他在樂(lè)園中游玩,享受各種設(shè)施;而樂(lè)園的設(shè)施則像是數(shù)據(jù)結(jié)構(gòu),它們存在著,等待游客的到來(lái)。游客游玩各種設(shè)施就像是操作數(shù)據(jù)結(jié)構(gòu)的過(guò)程。過(guò)山車(chē)、旋轉(zhuǎn)木馬、摩天輪等設(shè)施天生就有自己的結(jié)構(gòu),如何去玩它們(如乘坐、體驗(yàn)刺激等)并不會(huì)改變它們固有的結(jié)構(gòu),這就表現(xiàn)出訪問(wèn)者模式的特性—操作與結(jié)構(gòu)分離。
這個(gè)例子雖然簡(jiǎn)單,但是足以讓我們對(duì)訪問(wèn)者模式有個(gè)直觀的理解。在這個(gè)模式下,數(shù)據(jù)結(jié)構(gòu)開(kāi)放訪問(wèn)但是本身并不會(huì)進(jìn)行數(shù)據(jù)操作,所有的數(shù)據(jù)操作由訪問(wèn)者完成。
Java例子
假設(shè)我們正在為這個(gè)樂(lè)園編寫(xiě)管理程序。樂(lè)園中的設(shè)施我們定義抽象基類(lèi)為Attract,并讓不同的設(shè)施如RollerCoaster(過(guò)山車(chē))、MerryGoRound(旋轉(zhuǎn)木馬)和FerrisWheel(摩天輪)都繼承它。每種設(shè)施我們都要定義一個(gè)accept方法,用于接收訪問(wèn)者。
public abstract class Attract {
public abstract void accept(Visitor visitor);
}
public class RollerCoaster extends Attract {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class MerryGoRound extends Attract {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class FerrisWheel extends Attract {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
然后,我們定義一個(gè)訪問(wèn)者接口Visitor,它有一系列的visit方法,分別與不同的設(shè)施對(duì)應(yīng)。
public interface Visitor {
void visit(RollerCoaster rollerCoaster);
void visit(MerryGoRound merryGoRound);
void visit(FerrisWheel ferrisWheel);
}
最后,我們定義一個(gè)實(shí)際的訪問(wèn)者,游客Tourist。游客會(huì)根據(jù)他的興趣和體力情況,選擇不同的設(shè)施進(jìn)行游玩。
public class Tourist implements Visitor {
@Override
public void visit(RollerCoaster rollerCoaster) {
// 游客去玩過(guò)山車(chē)
}
@Override
public void visit(MerryGoRound merryGoRound) {
// 游客去玩旋轉(zhuǎn)木馬
}
@Override
public void visit(FerrisWheel ferrisWheel) {
// 游客去玩摩天輪
}
}
以上就是訪問(wèn)者模式在java中的一個(gè)應(yīng)用示例,希望這個(gè)例子有助于你理解和掌握訪問(wèn)者模式。至此,我們就對(duì)訪問(wèn)者模式有了非常清晰的理解。它是一種讓操作與數(shù)據(jù)結(jié)構(gòu)分離的設(shè)計(jì)模式,使我們能在不改變數(shù)據(jù)結(jié)構(gòu)的情況下添加新的操作。
記住,當(dāng)你在設(shè)計(jì)一個(gè)系統(tǒng)的時(shí)候,如果看到操作經(jīng)常變化但數(shù)據(jù)結(jié)構(gòu)相對(duì)穩(wěn)定,那么訪問(wèn)者模式可能就是一個(gè)非常好的設(shè)計(jì)選擇。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-818925.html
如果上面的內(nèi)容對(duì)你有幫助,請(qǐng)點(diǎn)贊收藏哦,我會(huì)分享更多的經(jīng)驗(yàn)~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-818925.html
到了這里,關(guān)于【設(shè)計(jì)模式】字節(jié)三面:請(qǐng)舉例闡釋訪問(wèn)者模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!