标签:
策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户对象。
设计原则:1 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
2 针对接口编程,而不是针对实现编程
3 多用组合,少用继承
举例 : 选取一个动作冒险游戏,不同角色 queen,king,knight等可以使用不同的武器,每个角色一次只能使用一种武器,但是游戏中可以更换武器。
分析 :很明显不变的部分是攻击的行为,变化的部分是使用的武器
1 创建变化部分的接口 weaponBehavior
public interface weaponBehavior { void uesWeapon();//约定的共有方法 }
2 创建不变部分的超类 character
public abstract class character { public weaponBehavior wb;//变化的行为在超类中被定义为接口变量 public void setWeaponBehavior(weaponBehavior t) // set方法可以动态的修改行为 { wb = t; } public abstract void fight();//需要子类去实现的共有的不变的方法抽象出来 }
至此,已经分离除了变化与不变化 ,下面只需要具体的子类去实现他们了 。
3 具体子类 武器 knifeBehavior,gunzi
public class knifeBehavior:weaponBehavior//实现武器接口 { public void uesWeapon() { System.Web.HttpContext.Current.Response.Write("<h1>-20 刀子</h1>"); } }
public class gunzi:weaponBehavior { public void uesWeapon(){ System.Web.HttpContext.Current.Response.Write("<h1>-10 棍子</h1>"); } }
4具体子类角色 queen
public class Queen:character { public Queen() //默认武器 棍子 放在构造函数中 { wb = new gunzi(); } public override void fight() //实现超类的攻击行为 { wb.uesWeapon(); //调用超类的接口变量实现 } }
5 测试一把
Queen qu = new Queen(); //创建角色 qu.setWeaponBehavior(new knifeBehavior());//更换武器 qu.fight();//攻击
标签:
原文地址:http://www.cnblogs.com/wangjian920110/p/5395965.html