C#实现原型模式

来源:互联网 发布:arpu值淘宝 编辑:程序博客网 时间:2024/05/06 19:30
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace 设计模式
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             //首先,原型模式是一种创建型模式,用来处理由于new所带来的依赖关系
  12.             //原型模式的要领有2点: 1 解决依赖,也就是说客户代码要依赖于抽象,而不是实现
  13.             //2 要通过接象的原型,克隆实现类的实例。
  14.             //下面我们举例说明: 比如一个魂斗罗游戏,我们来模拟处理不同的敌人 .
  15.             //敌人分为天上飞上,地上走的,水里游的。。  天上飞的可以扔炸弹,地上走的可以打枪,水里游的可以使用刀子伤人
  16.             //下面我们开始定义3种敌人的抽象类,注,因为要实现克隆方法,所以不可以是接口。
  17.             //接着,我们为这三种类型的人,来做具体的实现类,比如水里游的敌人,我们做一种穿盔甲的敌人。
  18.             //这就是封装了变化点,就是说,水里游的敌人,什么时候都一定会有刀,但是有的是有盔甲的,有的是没有的。
  19.             //也就是说,刀不变,盔甲可以变,因为是举例说明,其他2种类型一样用盔甲来说明变化,其实如果是真实项目,变化点的抽像应更多
  20.             //接着我们编写游戏运行时的情况,这里,我们完全不依赖于实现类,但是可以制造出一批一批的敌人。
  21.             //下面我们开始运行游戏。。。。
  22.             WaterActor w = new ArmorWaterActor() ;
  23.             FlyActor f = new NormalFlyActorActor() ;
  24.             RoadActor r = new ArmorRoadActor() ;
  25.             //可以看出,我们将水中的人,与陆地的人,实例化成了有盔甲的兵
  26.             GameSystem gm = new GameSystem( w , r ,f ) ;
  27.             gm.RunGame() ;
  28.             //假设我们要将水中与陆地的人,换成没有盔甲的,只需要要在些处,给他们不同的实例,不需要去动依赖处GM
  29.             WaterActor w1 = new NormalWaterActor() ;
  30.             FlyActor f1 = new ArmorFlyActorActor() ;
  31.             RoadActor r1 = new  NormalRoadActor() ;
  32.             //可以看出,我们将水中的人,与陆地的人,实例化成了有盔甲的兵
  33.             GameSystem gm1 = new GameSystem( w1 , r1 ,f1 ) ;
  34.             gm1.RunGame() ;
  35.             Console.ReadLine() ;
  36.         }
  37.     }
  38.     //水里游的敌人
  39.     abstract class WaterActor
  40.     {
  41.         //返回自身的实例,用系统自带的浅拷贝,注,如果是有引用类型,推荐用序列化与反序列化实现深度拷贝
  42.         public WaterActor Clone()
  43.         {
  44.             return ( WaterActor )this.MemberwiseClone() ;
  45.         }
  46.         //小刀攻击方法
  47.         public abstract void KnifeAttack() ;
  48.     }
  49.      //天上飞的敌人
  50.     abstract class FlyActor
  51.     {
  52.         public FlyActor Clone()
  53.         {
  54.             return ( FlyActor )this.MemberwiseClone() ;
  55.         }
  56.         //投掷炸弹
  57.         public abstract void BombAttack() ;
  58.     }
  59.     
  60.     //地上走的敌人
  61.     abstract class RoadActor
  62.     {
  63.         public RoadActor Clone()
  64.         {
  65.             return ( RoadActor )this.MemberwiseClone() ;
  66.         }
  67.         //机枪扫射
  68.         public abstract void GunAttack() ;
  69.     }
  70.     class ArmorWaterActor:WaterActor
  71.     {
  72.         public override void KnifeAttack()
  73.         {
  74.             Console.WriteLine( "%%%有盔甲水中敌人用小刀攻击" ) ;
  75.         }
  76.     }
  77.     class NormalWaterActor:WaterActor
  78.     {
  79.         public override void KnifeAttack()
  80.         {
  81.             Console.WriteLine( "%%%%%%%%%%%%没有盔甲水中敌人用小刀攻击" ) ;
  82.         }
  83.     }
  84.     class ArmorFlyActorActor:FlyActor
  85.     {
  86.         public override void BombAttack()
  87.         {
  88.             Console.WriteLine( "###有盔甲空中敌人投掷炸弹" ) ;
  89.         }
  90.     }
  91.     class NormalFlyActorActor:FlyActor
  92.     {
  93.         public override void BombAttack()
  94.         {
  95.             Console.WriteLine( "###############没有盔甲空中敌人投掷炸弹" ) ;
  96.         }
  97.     }
  98.     class ArmorRoadActor:RoadActor
  99.     {
  100.         public override void GunAttack()
  101.         {
  102.             Console.WriteLine( "@@@有盔甲陆地敌人用机枪扫射" ) ;
  103.         }
  104.     }
  105.     class NormalRoadActor:RoadActor
  106.     {
  107.         public override void GunAttack()
  108.         {
  109.             Console.WriteLine( "@@@@@@@@@@@没有盔甲陆地敌人用机枪扫射" ) ;
  110.         }
  111.     }
  112.     class GameSystem
  113.     {
  114.         private WaterActor wactor  ;
  115.         private RoadActor ractor ;
  116.         private FlyActor factor ;
  117.         public GameSystem( WaterActor wactor , RoadActor ractor , FlyActor factor )
  118.         {
  119.             this.wactor = wactor ;
  120.             this.ractor = ractor ;
  121.             this.factor = factor ;
  122.         }
  123.         public void RunGame()
  124.         {
  125.             WaterActor w1 = this.wactor.Clone() ;
  126.             WaterActor w2 = this.wactor.Clone() ;
  127.             WaterActor w3 = this.wactor.Clone() ;
  128.             WaterActor w4 = this.wactor.Clone() ;
  129.             WaterActor w5 = this.wactor.Clone() ;
  130.             //在此处,我们完全不关心,子类是有盔甲的,还是没有盔甲的。。不管你有盔甲没,都要攻击。。
  131.             w1.KnifeAttack() ;
  132.             w2.KnifeAttack() ;
  133.             w3.KnifeAttack() ;
  134.             w4.KnifeAttack() ;
  135.             w5.KnifeAttack() ;
  136.             FlyActor f1 = this.factor.Clone() ;
  137.             FlyActor f2 = this.factor.Clone() ;
  138.             FlyActor f3 = this.factor.Clone() ;
  139.             FlyActor f4 = this.factor.Clone() ;
  140.             
  141.             f1.BombAttack() ;
  142.             f2.BombAttack() ;
  143.             f3.BombAttack() ;
  144.             f4.BombAttack() ;
  145.             RoadActor r1 = this.ractor.Clone() ;
  146.             RoadActor r2 = this.ractor.Clone() ;
  147.             RoadActor r3 = this.ractor.Clone() ;
  148.             RoadActor r4 = this.ractor.Clone() ;
  149.             RoadActor r5 = this.ractor.Clone() ;
  150.             r1.GunAttack() ;
  151.             r2.GunAttack() ;
  152.             r3.GunAttack() ;
  153.             r4.GunAttack() ;
  154.             r5.GunAttack() ;
  155.         }
  156.     }
  157. }
原创粉丝点击