魔法牌裡的模式(Bridge) (轉)

worldblog發表於2008-01-31
魔法牌裡的模式(Bridge) (轉)[@more@]

 

不知道各位有沒有玩過魔法牌.基本分也兩種.一種稱為卡.另一種稱為輔助卡片.

攻擊卡負責攻擊.而輔助卡則負責效果.例如加強攻擊效果.或者減弱敵方攻擊效果等等

這樣看了.實現部分是就是所謂的攻擊卡.而抽象部分就是效果卡.他們有聯絡可是聯絡

並非平行的聯絡.也就是說並不象如同劍士可以派生出魔法劍士,光明劍士等這樣的情況

攻擊效果卡.和攻擊卡本身的聯絡不是靜態的可以透過繼承來完成的.而是需要動態的

繫結.這就很明顯要使用抽象類和介面了.那麼也就引出了設計Bridge.那麼下面

我就來模擬魔法牌中的效果.假設我有兩張劍士卡片.分別是魔法劍士和光明劍士.和

兩張效果卡.一張是加攻擊效果400 另一張是減弱攻擊效果300.並且是動態的建立

效果的攻擊卡之間的聯絡.

具體實現:

//攻擊卡
public interface IAttackCode{
  int Pow{get;set};
  ImpactCode Impact{get;};
  void effect();
}

//效果卡行為介面
public interface IImpactCode{
  IAttackCode Attack{get;}
  void effect();
}

下面我們就來正式實現具體卡片之間的聯絡.

//魔法劍士
public MagicKnightCode :IAttackCode{
  IImpactCode  impact;
  int  pow;
  public MagicKnightCode () {
  impact=ImpSingleton.impact;
  pow=1800;
  }
 
  public IImpactCode Impact{
  get{return this.impact;}
  }
 
  public int Pow{
  get{return pow;}
  set{pow=value;}
  }

  public void effect(){
  Console.WriteLine("魔法劍士的攻擊力"+pow);
  }
}

//光明劍士
public SunKnightCode :IAttackCode{
  IImpactCode  impact;
  int  pow;
  public SunKnightCode () {
  impact=ImpSingleton.impact;
  pow=2000;
  }
 
  public IImpactCode Impact{
  get{return this.impact;}
  }
 
  public int Pow{
  get{return pow;}
  set{pow=value;}
  }

  public void effect(){
  impact.effect();
  Console.WriteLine("光明劍士的攻擊力"+pow);
  }
}

接下來是效果卡的具體實現.

//攻擊力加400
public class AddActtack : IImpactCode{
  IActtackCode acttack;
 
  public AddActtack(){
  acttack=ImpSingleton.Acttack;
  }
 
  public IActtackCode Acttack{
  return acttack;
  }
 
  public void effect{
  impact.effect();
  acttack.Pow+=400;
  }
}
//攻擊力減弱300
public class SubtrationActtack:IImpactcode{

  IActtackCode acttack;
 
  public SubtrationActtack(){
  acttack=ImpSingleton.Acttack;
  }
 
  public IActtackCode Acttack{
  return acttack;
  }
 
  public void effect{
  acttack.Pow-=300;
  }

}

下面是這個模式的最後一步.我將建立一個Singleton模式.來完成兩者的對接工作

因為必須保證卡片在每回合必須是單一的.所以才用Singleton模式

public class ImpSingleton{
  prviate static IImptactCode Imptack;
  prviate static IActtackCode Acttack;
 
  public ImpSingleton(IImptactCode im IActtackCode ac){
  this.Imptack = im;
  this.Acttack = ac; 
  }

  public static IImpatackCode imptack{
  get{retrun Imptack;}
  }
 
  public static IActtack acttack{
  get{retrun Acttack;}
  }
 
  public void effect(){
  this.Acttack.effect();
  }
}


public class Client {

  public static int Main(string[] args){
  //為魔法劍士使用加攻擊力的效果卡
  ImpSingleton Is=
  new ImpSingleton(new MagicKnightCode(),new AddActtack());
  Is.effect();

  //為光明劍士使用減弱效果卡
  Is=null
  Is=
  new ImpSingleton(new SunKnightCode(),new SubtrationActtack());
  Is.effect();
  return 0;
  }
}

由此可以看出Bridge模式把兩個需要動態繫結的是很有用的.如果在中

就可以把資料和實際的業務邏輯分開.


 


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

相關文章