日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳解訪問者模式

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

成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供富陽網(wǎng)站建設(shè)、富陽做網(wǎng)站、富陽網(wǎng)站設(shè)計(jì)、富陽網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、富陽企業(yè)網(wǎng)站模板建站服務(wù),十年富陽做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

使用場景

訪問者模式適用于數(shù)據(jù)結(jié)構(gòu)相對穩(wěn)定的系統(tǒng),它把數(shù)據(jù)結(jié)構(gòu)和作用域結(jié)構(gòu)上的操作之間的耦合解脫開,使用操作集合可以相對自由地演化。

訪問者模式的目的是要把處理從數(shù)據(jù)結(jié)構(gòu)分離出來,有比較穩(wěn)定的數(shù)據(jù)結(jié)構(gòu),又有易于變化的算法時(shí),使用訪問者模式就是比較適合的, 因?yàn)樵L問者模式使得算法操作的增加變得容易。反之,如果數(shù)據(jù)結(jié)構(gòu)對象易于變化,經(jīng)常有新的數(shù)據(jù)對象增加進(jìn)來,就不適合使用訪問者模式。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

增加新的操作很容易,增加新的操作就意味著增加一個(gè)新的訪問者,訪問者模式將有關(guān)的行為集中到一個(gè)訪問者對象中。 缺點(diǎn):

增加新的數(shù)據(jù)結(jié)構(gòu)困難,破壞 開放封閉 原則

舉例

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í),感慨道:戀愛游戲終結(jié)時(shí),'有妻徒刑'遙無期");
   }

   public override void GetWomanConclusion(Woman woman)
   {
       Console.WriteLine($"{woman.GetType().Name} {GetType().Name} 時(shí),欣慰曰:愛情長路跑漫漫,婚姻保險(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

訪問者模式 允許一個(gè)或者多個(gè)操作應(yīng)用到一組對象上,解耦操作和對象本身。它可以算是 23 種經(jīng)典設(shè)計(jì)模式中最難理解的幾個(gè)之一。因?yàn)樗y理解、難實(shí)現(xiàn),應(yīng)用它會導(dǎo)致代碼的可讀性、可維護(hù)性變差

所以,訪問者模式在實(shí)際的軟件開發(fā)中很少被用到,在沒有特別必要的情況下,建議你不要使用訪問者模式。


當(dāng)前題目:詳解訪問者模式
標(biāo)題來源:http://www.5511xx.com/article/djgejoi.html