C#實現原型模式

來源:互聯網
上載者:User
  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. }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.