新聞中心
最復(fù)雜的設(shè)計(jì)模式,并且使用頻率不高,《設(shè)計(jì)模式》的作者評(píng)價(jià)為:大多情況下,你不需要使用訪問(wèn)者模式,但是一旦需要使用它時(shí),那就真的需要使用了。

成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供富陽(yáng)網(wǎng)站建設(shè)、富陽(yáng)做網(wǎng)站、富陽(yáng)網(wǎng)站設(shè)計(jì)、富陽(yáng)網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、富陽(yáng)企業(yè)網(wǎng)站模板建站服務(wù),十年富陽(yáng)做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
使用場(chǎng)景
訪問(wèn)者模式適用于數(shù)據(jù)結(jié)構(gòu)相對(duì)穩(wěn)定的系統(tǒng),它把數(shù)據(jù)結(jié)構(gòu)和作用域結(jié)構(gòu)上的操作之間的耦合解脫開(kāi),使用操作集合可以相對(duì)自由地演化。
訪問(wèn)者模式的目的是要把處理從數(shù)據(jù)結(jié)構(gòu)分離出來(lái),有比較穩(wěn)定的數(shù)據(jù)結(jié)構(gòu),又有易于變化的算法時(shí),使用訪問(wèn)者模式就是比較適合的, 因?yàn)樵L問(wèn)者模式使得算法操作的增加變得容易。反之,如果數(shù)據(jù)結(jié)構(gòu)對(duì)象易于變化,經(jīng)常有新的數(shù)據(jù)對(duì)象增加進(jìn)來(lái),就不適合使用訪問(wèn)者模式。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
增加新的操作很容易,增加新的操作就意味著增加一個(gè)新的訪問(wèn)者,訪問(wèn)者模式將有關(guān)的行為集中到一個(gè)訪問(wèn)者對(duì)象中。 缺點(diǎn):
增加新的數(shù)據(jù)結(jié)構(gòu)困難,破壞 開(kāi)放封閉 原則
舉例
public abstract class Person
{
public abstract void Accept(AbstractAction visitor);
}
public class Man : Person
{
public override void Accept(AbstractAction visitor)
{
visitor.GetManConclusion(this);
}
}
public class Woman : Person
{
public override void Accept(AbstractAction visitor)
{
visitor.GetWomanConclusion(this);
}
}
public abstract class AbstractAction
{
public abstract void GetManConclusion(Man man);
public abstract void GetWomanConclusion(Woman woman);
}
public class Success : AbstractAction
{
public override void GetManConclusion(Man man)
{
Console.WriteLine($"{man.GetType().Name} {GetType().Name} 時(shí),背后多半有一個(gè)偉大的女人");
}
public override void GetWomanConclusion(Woman woman)
{
Console.WriteLine($"{woman.GetType().Name} {GetType().Name} 時(shí),背后多有一個(gè)不成功的男人");
}
}
public class Fail : AbstractAction
{
public override void GetManConclusion(Man man)
{
Console.WriteLine($"{man.GetType().Name} {GetType().Name} 時(shí),背后多半有一個(gè)偉大的女人");
}
public override void GetWomanConclusion(Woman woman)
{
Console.WriteLine($"{woman.GetType().Name} {GetType().Name} 時(shí),背后多有一個(gè)不成功的男人");
}
}
public class Marriage : AbstractAction
{
public override void GetManConclusion(Man man)
{
Console.WriteLine($"{man.GetType().Name} {GetType().Name} 時(shí),感慨道:戀愛(ài)游戲終結(jié)時(shí),'有妻徒刑'遙無(wú)期");
}
public override void GetWomanConclusion(Woman woman)
{
Console.WriteLine($"{woman.GetType().Name} {GetType().Name} 時(shí),欣慰曰:愛(ài)情長(zhǎng)路跑漫漫,婚姻保險(xiǎn)保平安.");
}
}
public class PersonStructure
{
private readonly IList _persons = new List();
public void Attach(Person person)
{
_persons.Add(person);
}
public void Detach(Person person)
{
_persons.Remove(person);
}
public void Display(AbstractAction visitor)
{
foreach (var person in _persons)
{
person.Accept(visitor);
}
}
}
var personStructure = new PersonStructure();
personStructure.Attach(new Man());
personStructure.Attach(new Woman());
personStructure.Display(new Success());
personStructure.Display(new Fail());
personStructure.Display(new Marriage());
More
訪問(wèn)者模式 允許一個(gè)或者多個(gè)操作應(yīng)用到一組對(duì)象上,解耦操作和對(duì)象本身。它可以算是 23 種經(jīng)典設(shè)計(jì)模式中最難理解的幾個(gè)之一。因?yàn)樗y理解、難實(shí)現(xiàn),應(yīng)用它會(huì)導(dǎo)致代碼的可讀性、可維護(hù)性變差
所以,訪問(wèn)者模式在實(shí)際的軟件開(kāi)發(fā)中很少被用到,在沒(méi)有特別必要的情況下,建議你不要使用訪問(wèn)者模式。
分享題目:詳解訪問(wèn)者模式
瀏覽地址:http://m.fisionsoft.com.cn/article/djgejoi.html


咨詢
建站咨詢
