不知道各位有没有玩过魔法牌.基本分也两种.一种称为攻击卡.另一种称为辅助卡片.
攻击卡负责攻击.而辅助卡则负责效果.例如加强攻击效果.或者减弱敌方攻击效果等等
这样看了.实现部分是就是所谓的攻击卡.而抽象部分就是效果卡.他们有联系可是联系
并非平行的联系.也就是说并不象如同剑士可以派生出魔法剑士,光明剑士等这样的情况
攻击效果卡.和攻击卡本身的联系不是静态的可以通过继承来完成的.而是需要动态的
绑定.这就很明显要使用抽象类和接口了.那么也就引出了设计模式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模式把两个需要动态绑定的对象是很有用的.如果在数据库系统中
就可以把数据存储和实际的业务逻辑分开.

|