zoukankan      html  css  js  c++  java
  • 设计模式之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);
    }
    }

  • 相关阅读:
    [BZOJ1492] [NOI2007]货币兑换Cash 斜率优化+cdq/平衡树维护凸包
    [BZOJ2638] 黑白染色
    [BZOJ2006] [NOI2010]超级钢琴 主席树+贪心+优先队列
    [BZOJ3698] XWW的难题 网络流
    [BZOJ2151] 种树 贪心
    js中的闭包理解一
    HTML5 input placeholder 颜色修改示例
    26 个 jQuery使用技巧
    JS原型与原型链(好文看三遍)
    文字和图片垂直居中
  • 原文地址:https://www.cnblogs.com/code-fun/p/11363293.html
Copyright © 2011-2022 走看看