设计模式之GOF23策略

策略模式strategy

场景:对不同客户的不同报价策略

如果采用if else不易扩展,不符合开闭原则,可以采用策略模式

策略模式:

对应于解决某一个问题的算法族,允许其中一个算法去解决某一问题,同时可以方便的更改和扩展算法,可以由客户端决定调用那个算法

结构:抽象策略类,具体策略类(算法族),上下文类(客户端和算法类的分离),客户端类

本质:分离算法,选择实现

开发中常见的场景

-javase中的GUI编程,布局管理

-Spring框架中,Resource接口,资源访问策略

-javax.servlet.http.HrrpServlet#service()

/**
 * 策略模式
 * 通过对同一接口的不同实现,形成算法族
 * @author 小帆敲代码
 *
 */
public interface Strategy {
  double getPrice(double standardPrice);
}
class NewCustomerFewStrategy implements Strategy{
 @Override
 public double getPrice(double standardPrice) {
  System.out.println("不打折,原价");
  return standardPrice;
 }
}
class NewCustomerManyStrategy implements Strategy{
 @Override
 public double getPrice(double standardPrice) {
  System.out.println("打九折");
  return standardPrice*0.9;
 }
}
class OldCustomerFewStrategy implements Strategy{
 @Override
 public double getPrice(double standardPrice) {
  System.out.println("打八五折");
  return standardPrice*0.85;
 }
}
class OldCustomerManyStrategy implements Strategy{
 @Override
 public double getPrice(double standardPrice) {
  System.out.println("打八折");
  return standardPrice*0.8;
 }
}

/**
 * 上下文类
 * 确保算法和客户端的分离
 * @author 小帆敲代码
 *
 */
public class Context {
  private Strategy strategy;//与算法进行交互
  //通过构造器设置算法
  public Context(Strategy strategy) {
   super();
   this.strategy = strategy;
  }
  //通过set方法
  public void setStrategy(Strategy strategy) {
   this.strategy = strategy;
  }
  public void getPrice(double s) {
   System.out.println("您的报价是"+strategy.getPrice(s));
  }
  
}

public class Client {
public static void main(String[] args) {
 Context c=new Context(new OldCustomerManyStrategy());
 c.getPrice(100);
}
}

posted @ 2019-08-16 13:18  小帆敲代码  阅读(214)  评论(0编辑  收藏  举报