訂閱屬於自己得資料(Visitor) (轉)

worldblog發表於2008-01-31
訂閱屬於自己得資料(Visitor) (轉)[@more@]

 

有時候.我們總是不希望出現不速之客.而是更希望來的是我們的朋友.可是如果

用一支普通的筆把所有人的名字記錄下來我們很難判斷那些才是我們的朋友.所

以.如果有一支友情之筆和一個之能呈現友情之筆的筆記本.那麼情況就好的多了.

就如同當你使用ArrayList或Hashtable之類的容器裝載資料的時候.所有的資料都

別染成了同樣的顏色--- 而你必須時刻判斷是否你想要的資料型別.你可能

總是在寫if (o is yourType)這樣的這樣很麻煩.也沒必要.因為你現在是要限定

訪問者.而不是一個可以容納所有的容器.或許你會說可以使用陣列yourType[] yt

那麼.很遺憾.你無法很方面的迭代和插入.刪除.查詢等容器可以方面完成的

東西.同樣你是為了把容器中的漂洗出來,才那樣作而不是真得為了取代容器

本身.因此現在你存在的問題如何指定一個你所需要的容器.這也就是為什麼要

提出visitor的必要性.那麼同樣我們還是來分工和抽象.透過上面的描述

需要兩份工作來完成這個操作.一個是負責定製訪問的Visitors 另一個則是

用來確定訪問型別的.也就是說他是守門的.只有符合型別才可以透過.其實這

個模式很簡單.OK還是從一個簡單的假設開始.

我們以我剛才說的朋友列表開始.朋友具有友情之筆所以是可以寫入到中的.

而沒有的就不可以.

//Visitors抽象物件開始

public interface IVisitors{
  void ListVisitor(IList IL);//迭代判斷訪問容器中好友
  void operationf (Friend f);//如果是好友就顯示
}

public class FrVisitor : IVisitors{

  public void ListVisitor(IList IL){
  int count,Item=0;
  count=IL.Count;
  //迭代元素
  for (Item;Item  if(IL[Item] is Visitable)
  (Visitable (IL[Item])).accept(this);
  }
  }
 
  public void operationf(Friend f){
  Console.WriteLine("好友是:"+f.neme);
  }
}

//可訪問物件得介面

public interface IVisitable{
  void  accept (IVisitor v) ;
}

public class Friend : IVisitable{
  public string name;
  public Friend(string n){
  this.name=n;
  }

  public void accept(IVisitor v){
  v.operationf(this);
  }
}

//下面客戶

 public class Client
  {
  public static int Main(string[] args)
  { 
  ArrayList al=new ArrayList();
  Friend f1=Friend("yarshray");
  Friend f2=Friend("Tommy");
  al.Add("baoy");
  al.Add("Bow");
  al.Add(f1);
  al.Add(f2);

  FrVisitor fv=new FrVisitor();
  fv.ListVisitor(al); 

  return 0;
  }
  }

最終只有好友才被顯示出來.事實上.當你在用而不是直接和打交道得時候

使用Visitor模式可以起到和資料檢視一樣得效果.把客戶不希望看到得資料遮蔽掉.而

之給客戶感興趣得資料.Visitor本身不儲存任何資料.只是作迭代和判斷.而Visiable

則負責是否處理.儲存依然交給容器.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998944/,如需轉載,請註明出處,否則將追究法律責任。

相關文章