魔法牌里的模式(Bridge)

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

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

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

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

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

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

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

Published At
Categories with Web编程
Tagged with
comments powered by Disqus