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