java基础之策略模式

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

  缺点:

  1、 因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。

  2、在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。(这本身没有解除客户端需要选择判断的压力,而策略模式与简单工厂模式结合后,选择具体实现的职责也可以由Context来承担,这就最大化的减轻了客户端的压力。)

  简单工厂模式和策略模式的比较

  个人举得这个策略模式和简单工厂模式一样。简单工厂模式中有一个工厂类,负责根据输入参数的不同来生成不同的子类,并将生成的子类作为基类返回(这样可以让客户端在使用的时候很方便)。客户端只需要调用工厂类创建一个基类的实例,然后调用这个实例的函数来实现自己的功能。而策略模式中的Context类的功能基本上类似,它也负责根据输入参数来生成不同的类,只是它并不返回生成类,而是将生成类所实现的功能接口包装一次,提供给客户。这样对客户来说,他们只需要知道这一个Context类就可以完成他们想要的功能,而不必再知道其他的信息。

  使用

  当存在以下情况时使用Strategy模式

  1)许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。即一个系统需要动态地在几种算法中选择一种。

  2) 需要使用一个算法的不同变体。

  3)算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。

  4)一个类定义了多种行为 ,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句

  案例

  ///

  /// 现金收费抽象类

  ///

  abstract class CashSuper

  {

  //现金收取超类的抽象方法,收取现金,参数为原价,返回当前价。

  public abstract doubleacceptCash(double money);

  }

  ///

  /// 正常收费子类

  ///

  class CashNormal:CashSuper

  {

  public override doubleacceptCash(double money)

  {

  return money;

  }

  }

  ///

  /// 打折子类

  ///

  class CashRebate:CashSuper

  {

  private double moneyRebate = 1d;

  public CashRebate(string moneyRebate)

  {

  this.moneyRebate =double.Parse(moneyRebate);

  }

  public override doubleacceptCash(double money)

  {

  return money * moneyRebate;

  }

  }

  ///

  /// 返利子类

  ///

  class CashReturn:CashSuper

  {

  private double moneyCondition = 0.0d;

  private double moneyReturn = 0.0d;

  ///

  /// 返利子类构造方法

  ///

  /// 返利标准

  /// 返利值

  public CashReturn(stringmoneyCondition, string moneyReturn)

  {

  this.moneyCondition =double.Parse(moneyCondition);

  this.moneyReturn =double.Parse(moneyReturn);

  }

  public override doubleacceptCash(double money)

  {

  double result = money;

  if (money >= moneyCondition)

  result = money -Math.Floor(money / moneyCondition) * moneyReturn;

  return result;

  }

  }

  class CashContext

  {

  CashSuper cs;

  public CashContext(string type)

  {

  //简单工厂构造函数,克服客户端需要知道所以算法子类的缺点(封装了变化)

  switch (type)

  {

  case “正常收费”:

  cs = new CashNormal();

  break;

  case “满300返100”:

  cs = newCashReturn(“300”, “100”);

  break;

  case “打8折”:

  cs = newCashRebate(“0.8”);

  break;

  }

  }

  //和简单工厂的不同之处

  public double GetResult(double money)

  {

  return cs.acceptCash(money);

  }

  }

  CashContext csuper =new CashContext(cmbDiscount.SelectedItem.ToString());

  double totalPrices = 0d;

  totalPrices =csuper.GetResult(double.Parse(this.txtPrice.Text) *double.Parse(this.txtNumber.Text));

  this.lbxResult.Items.Add(“单价:” + this.txtPrice.Text + “数量:” + this.txtNumber.Text + ” ” + cmbDiscount.SelectedItem +” ” + “合计” + totalPrices.ToString());

  total = total + totalPrices;

  this.lblAmount.Text =total.ToString();

  总结

  1)策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。

  2)在策略模式中,应当由客户端自己决定在什么情况下使用什么具体策略角色。2)

  3)策略模式仅仅封装算法,提供新算法插入到已有系统中,以及老算法从系统中“退休”的方便,策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定。这在一定程度上提高了系统的灵活性,但是客户端需要理解所有具体策略类之间的区别,以便选择合适的算法,这也是策略模式的缺点之一,在一定程度上增加了客户端的使用难度。

[1][2]

继续期待我的下一个旅行,拿起背包,

java基础之策略模式

相关文章:

你感兴趣的文章:

标签云: