六個(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)載出處: