好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#设计模式之Visitor访问者模式解决长隆欢乐世界问题实例

本文实例讲述了c#设计模式之visitor访问者模式解决长隆欢乐世界问题。分享给大家供大家参考,具体如下:

一、理论定义

访问者模式 提供了 一组 集合 对象 统一的 访问接口,适合对 一个集合中的对象,进行逻辑操作,使 数据结构  和 逻辑结构分离。

二、应用举例

需求描述:暑假来啦!三个小伙子组团,开车来 长隆欢乐世界玩。
每个人想玩的项目都不一样,
旅游者 1   想玩:十环过山车,龙卷风暴,梦幻旋马
旅游者 2   想玩:空中警察,欢乐摩天轮,超级水战
旅游者 3   想玩:四维影院,垂直极限,u型滑板
车开到长隆后,就开始各自enjoy啦!!!

三、具体编码

1.一个旅游者接口,里面有一个play游玩 方法

?

using system;

using system.collections.generic;

using system.linq;

using system.text;

namespace com.design.gof.visitor

{

   public interface itourist

   {

     /// <summary>

     /// 游玩

     /// </summary>

     /// <param name="happyworld">长隆欢乐世界</param>

      void play(changlonghappyworld happyworld);

   }

}

2.每个人要玩什么项目,都有一个标志

?

using system;

using system.collections.generic;

using system.linq;

using system.text;

namespace com.design.gof.visitor

{

   [attributeusage(attributetargets.method, allowmultiple = false , inherited = false )]

   public class playattribute : attribute

   {

     private string _playitem;

     /// <summary>

     /// 游玩的项目

     /// </summary>

     public string playitem

     {

       get { return _playitem; }

       set { _playitem = value; }

     }

   }

}

3.长隆欢乐世界

?

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.reflection;

namespace com.design.gof.visitor

{

   /// <summary>

   /// 长隆欢乐世界

   /// </summary>

   public class changlonghappyworld

   {

     /// <summary>

     /// 接待各个访问者

     /// </summary>

     /// <param name="visitor"></param>

     public void visit(itourist visitor) {

       //每个旅游者想玩的项目不一样。使用反射,方便调用

       methodinfo[] method = visitor.gettype().getmethods();

       foreach (methodinfo m in method) {

         object [] property= m.getcustomattributes( false );

         string customerattribute = null ;

         if (property.length>0) {

           customerattribute = property[0].tostring();

         }

         if (customerattribute == "com.design.gof.visitor.playattribute" )

         {

           m.invoke(visitor, new object [] { });

         }

       }

     }

   }

}

4.旅游者  1

?

using system;

using system.collections.generic;

using system.linq;

using system.text;

namespace com.design.gof.visitor

{

   /// <summary>

   /// 旅游者 1  想玩:十环过山车,龙卷风暴,梦幻旋马

   /// </summary>

   public class touristone : itourist

   {

     /// <summary>

     /// 十环过山车

     /// </summary>

     [playattribute(playitem = "tenthringrollercoaster" )]

     public void play_tenthringrollercoaster() {

       console.writeline( "我是游客1,我现在玩的是:十环过山车" );

     }

     /// <summary>

     /// 龙卷风暴

     /// </summary>

      [playattribute(playitem = "tornadostorm" )]

     public void play_tornadostorm()

     {

       console.writeline( "我是游客1,我现在玩的是:龙卷风暴" );

     }

     /// <summary>

     /// 梦幻旋马

     /// </summary>

     [playattribute(playitem = "dreamhorse" )]

     public void play_dreamhorse()

     {

       console.writeline( "我是游客1,我现在玩的是:梦幻旋马" );

     }

     public void play(changlonghappyworld happyworld)

     {

       happyworld.visit( this );

     }

   }

}

5.旅游者 2

?

using system;

using system.collections.generic;

using system.linq;

using system.text;

namespace com.design.gof.visitor

{

   /// <summary>

   /// 旅游者 2  想玩:空中警察,欢乐摩天轮,超级水战

   /// </summary>

   public class touristtwo : itourist

   {

     /// <summary>

     /// 空中警察

     /// </summary>

     [playattribute(playitem = "airpolice" )]

     public void play_airpolice() {

       console.writeline( "我是游客2,我现在玩的是:空中警察" );

     }

     /// <summary>

     /// 欢乐摩天轮

     /// </summary>

     [playattribute(playitem = "ferriswheel" )]

     public void play_ferriswheel()

     {

       console.writeline( "我是游客2,我现在玩的是:欢乐摩天轮" );

     }

     /// <summary>

     /// 超级水战

     /// </summary>

     [playattribute(playitem = "superwater" )]

     public void play_superwater()

     {

       console.writeline( "我是游客2,我现在玩的是:超级水战" );

     }

     public void play(changlonghappyworld happyworld)

     {

       happyworld.visit( this );

     }

   }

}

6.旅游者 3

?

using system;

using system.collections.generic;

using system.linq;

using system.text;

namespace com.design.gof.visitor

{

   /// <summary>

   /// 旅游者 3  想玩:四维影院,垂直极限,u型滑板

   /// </summary>

   public class touristthree : itourist

   {

     /// <summary>

     /// 四维影院

     /// </summary>

     [playattribute(playitem = "airpolice" )]

     public void play_cinema4d() {

       console.writeline( "我是游客3,我现在玩的是:四维影院" );

     }

     /// <summary>

     /// 垂直极限

     /// </summary>

     [playattribute(playitem = "verticallimit" )]

     public void play_verticallimit()

     {

       console.writeline( "我是游客3,我现在玩的是:垂直极限" );

     }

     /// <summary>

     /// u型滑板

     /// </summary>

     [playattribute(playitem = "ushapeskateboard" )]

     public void play_ushapeskateboard()

     {

       console.writeline( "我是游客3,我现在玩的是:u型滑板" );

     }

     public void play(changlonghappyworld happyworld)

     {

       happyworld.visit( this );

     }

   }

}

7.主函数

?

using system;

using system.collections.generic;

using system.linq;

using system.text;

using com.design.gof.visitor;

namespace com.design.gof.test

{

   class program

   {

     static void main( string [] args)

     {

       //三个小伙子,开车到长隆欢乐世界 游玩, 每个人想玩的项目都不一样。

       list<itourist> list = new list<itourist> {

        new touristone(),

        new touristtwo(),

        new touristthree()

       };

       //车开到了长隆 南大门,长隆到了

       changlonghappyworld happyworld = new changlonghappyworld();

       //开始 游玩 长隆啦!!

       foreach (var visit in list) {

         visit.play(happyworld);

         console.writeline( "------------------------------------------------" );

       }

       console.readkey();

     }

   }

}

8.运行结果

9.总结

运用c#的反射 来实现 复杂点的 访问者模式 。

附: 完整实例代码点击此处 本站下载 。

希望本文所述对大家c#程序设计有所帮助。

原文链接:http://HdhCmsTestcnblogs测试数据/HCCZX/archive/2012/08/02/2619723.html

dy("nrwz");

查看更多关于C#设计模式之Visitor访问者模式解决长隆欢乐世界问题实例的详细内容...

  阅读:38次