订阅属于自己得资料(Visitor)

原创 2003年07月15日 16:15:00

 

有时候.我们总是不希望出现不速之客.而是更希望来的是我们的朋友.可是如果

用一支普通的笔把所有人的名字记录下来我们很难判断那些才是我们的朋友.所

以.如果有一支友情之笔和一个之能呈现友情之笔的笔记本.那么情况就好的多了.

就如同当你使用ArrayList或Hashtable之类的容器装载数据的时候.所有的数据都

别染成了同样的颜色---object 而你必须时刻判断是否你想要的数据类型.你可能

总是在写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<count-1;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("badboy");
            al.Add("Bow");
            al.Add(f1);
            al.Add(f2);

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

            return 0;
        }
    }

最终只有好友才被显示出来.事实上.当你在用组件而不是直接和数据库打交道得时候

使用Visitor模式可以起到和数据视图一样得效果.把客户不希望看到得数据屏蔽掉.而

之给客户感兴趣得数据.Visitor本身不存储任何数据.只是作迭代和判断.而Visiable

则负责是否处理.存储依然交给容器.

WUST OJ 2051: Big Boss

WUST OJ 2051: Big Boss Big Boss是一名十分强大的士兵,甚至用“全世界最伟大的战士”来称呼他都不为过分,Big Boss不仅拥有超强的战斗技巧,他的战斗意识也是十分的过人。...
  • Mitsuha_
  • Mitsuha_
  • 2017年08月01日 21:52
  • 218

JAVA设计模式之Visitor模式

一个集合(Collection)中,可以包含一个Car,也可以包含一个Cat,对于不同类型的元素,他们的行为也不尽相同,比如,Car可能有start()行为,而Cat可能有eat()的行为。可是对于C...
  • chenjie19891104
  • chenjie19891104
  • 2011年05月04日 13:46
  • 13503

Java设计模式(三) Visitor(访问者)模式及多分派场景应用

基本概念Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作可以借助新的visitor实现,降低了操作间的耦合性 访问者可以将数据结构和对数据的操作解耦,使得增加对数据结构的操作不需要取...
  • qq_24451605
  • qq_24451605
  • 2016年04月14日 15:32
  • 5198

在自己的网站上使用RSS订阅功能

RSS是啥? 具体还是不说,
  • qq1010885678
  • qq1010885678
  • 2014年07月07日 16:58
  • 1133

JAVA设计模式十四--Visitor(访问者模式)

访问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式。 据《大话设计模式》中说算是最复杂也是最难以理解的一种模式了。    定义(源于GoF《Design...
  • hfmbook
  • hfmbook
  • 2012年06月22日 10:20
  • 8931

设计模式:Visitor模式

Visitor模式是一个用起来很简单,理解起来可能稍微有一点困难的模式。不过明白了之后就清楚了,其实也是非常的简单。问题需要向对象结构中增加新的方法,但是增加起来会很费劲或者会破坏设计。 案例举一个例...
  • superbeck
  • superbeck
  • 2010年02月25日 14:02
  • 10970

设计模式总结之Visitor Pattern(访问者模式)

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。...
  • cooldragon
  • cooldragon
  • 2016年08月12日 12:10
  • 4120

小技巧绕过Sina Visitor System(新浪访客系统)

0x00 前言 一直以来,爬虫与反爬虫技术都时刻进行着博弈,而新浪微博作为一个数据大户更是在反爬虫上不遗余力。常规手段如验证码、封IP等等相信很多人都见识过…… 当然确实有需要的话可以通过...
  • u013474557
  • u013474557
  • 2015年01月03日 13:27
  • 3193

设计模式(行为型)之访问者模式(Visitor Pattern)

访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。访问者模式使得用户可以在不修改现有系...
  • yanbober
  • yanbober
  • 2015年05月06日 17:11
  • 3228

Kafka 消息订阅与分发

1、简介     Kafka is a distributed,partitioned,replicated commit logservice。它提供了类似于JMS的特性,但是在设计实现上完全不同...
  • gobravery
  • gobravery
  • 2017年05月03日 15:02
  • 1193
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:订阅属于自己得资料(Visitor)
举报原因:
原因补充:

(最多只允许输入30个字)