visitor pattern 訪問者模式

六個(gè)角色:抽象訪問者(Visitor)、具體訪問者(ConcreteVisitor)、抽象元素(Element)、具體元素(ConcreteElement)、對(duì)象結(jié)構(gòu)類(ObjectStructure)、客戶端(Client)

抽象訪問者(Visitor):抽象出訪問元素的動(dòng)作

具體訪問者(ConcreteVisitor):實(shí)現(xiàn)訪問元素的動(dòng)作

抽象元素(Element):定義一個(gè)接受訪問的操作,其參數(shù)為訪問者

具體元素(ConcreteElement):實(shí)現(xiàn)接受訪問操作

對(duì)象結(jié)構(gòu)類(ObjectStructure):可以枚舉元素,并且管理元素

客戶端(Client) :定義元素集合,然后接受不同訪問者的訪問

實(shí)現(xiàn)思路:向?qū)ο蠼Y(jié)構(gòu)類中添加元素,然后定義多種訪問者,使用對(duì)象結(jié)構(gòu)類去接受訪問者即可。

類圖:

應(yīng)用場景:用戶去訪問博客

分析:用戶可以通過電腦上的Web方式(訪問者)或者手機(jī)Wap方式(訪問者)去訪問博客,每篇博客是一個(gè)元素,然后博客列表是一個(gè)對(duì)象結(jié)構(gòu)類。

下面我們?cè)诳刂婆_(tái)程序去演示一下如何使用Visitor Pattern:

一、抽象訪問者(Visitor):

//抽象訪問者(Visitor)

abstract class Visitor

{

public abstract void VisitBlog(Element element);

}

二、具體訪問者(ConcreteVisitor):

//具體訪問者(ConcreteVisitor)

class WebVisitor : Visitor

{

public override void VisitBlog(Element element)

{

Console.WriteLine("通過電腦web網(wǎng)站方式訪問Blog:" + element.BlogName);

}

}

//具體訪問者(ConcreteVisitor)

class WapVisitor : Visitor

{

public override void VisitBlog(Element element)

{

Console.WriteLine("通過手機(jī)wap網(wǎng)站方式訪問Blog:" + element.BlogName);

}

}

三、抽象元素(Element):

//抽象元素(Element)

abstract class Element

{

public string BlogName { get; set; }

abstract public void Accept(Visitor visotr);

}

四、具體元素(ConcreteElement):

//具體元素(ConcreteElement)

class BlogElement : Element

{

public BlogElement(string blogname)

{

this.BlogName = blogname;

}

public override void Accept(Visitor visitor)

{

visitor.VisitBlog(this);

}

}

五、對(duì)象結(jié)構(gòu)類(ObjectStructure):

//對(duì)象結(jié)構(gòu)類(ObjectStructure)

class Blogs

{

private IList blogList = new List();

public void AddBlog(Element element)

{

blogList.Add(element);

}

public void RemoveBlog(Element element)

{

blogList.Remove(element);

}

public void Accept(Visitor visitor)

{

foreach (Element e in blogList)

e.Accept(visitor);

}

}

六、客戶端(Client) :

//客戶端(Client)

class Program

{

static void Main(string[] args)

{

Blogs blogs = new Blogs();

blogs.AddBlog(new BlogElement("這是第一篇博文"));

blogs.AddBlog(new BlogElement("這是第二篇博文"));

blogs.AddBlog(new BlogElement("這是第三篇博文"));

blogs.AddBlog(new BlogElement("這是第四篇博文"));

Visitor webVisit = new WebVisitor();

Visitor wapVisit = new WapVisitor();

blogs.Accept(webVisit);

blogs.Accept(wapVisit);

Console.ReadLine();

}

}

如需源碼請(qǐng)點(diǎn)擊?VisitorPattern.rar?下載。

原文轉(zhuǎn)載出處:

https://blog.csdn.net/weixin_34

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容