魔法牌里的模式(Bridge) (转)

魔法牌里的模式(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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-998916/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值