策略模式

策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户对象。

设计原则: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();//攻击

      

原文地址:https://www.cnblogs.com/wangjian920110/p/5395965.html