魔法牌里的模式(Bridge)

类别:.NET开发 点击:0 评论:0 推荐:

 

不知道各位有没有玩过魔法牌.基本分也两种.一种称为攻击卡.另一种称为辅助卡片.

攻击卡负责攻击.而辅助卡则负责效果.例如加强攻击效果.或者减弱敌方攻击效果等等

这样看了.实现部分是就是所谓的攻击卡.而抽象部分就是效果卡.他们有联系可是联系

并非平行的联系.也就是说并不象如同剑士可以派生出魔法剑士,光明剑士等这样的情况

攻击效果卡.和攻击卡本身的联系不是静态的可以通过继承来完成的.而是需要动态的

绑定.这就很明显要使用抽象类和接口了.那么也就引出了设计模式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模式把两个需要动态绑定的对象是很有用的.如果在数据库系统中

就可以把数据存储和实际的业务逻辑分开.


 

本文地址:http://com.8s8s.com/it/it45524.htm