策略模式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);
}
}

最新文章

  1. 自定义MVC框架
  2. core dump gdb调试
  3. 在Linux下运行C语言程序
  4. HTML--8Window.document对象
  5. OneAlert 入门(二)——事件分析
  6. Android SmartImageView框架的简单实用
  7. n%i之和
  8. windows下Qt Creator5.1.0编写程序以及调用OpenCV库
  9. chapter11_2 Lua链表与队列
  10. 本地修改js代码并时时生效的解决办法
  11. 就是要你懂Java中volatile关键字实现原理
  12. [笔记]使用Keepalived实现Nginx主从热备
  13. android仿漫画源码、抽奖转盘、Google相册、动画源码等
  14. 芝麻HTTP:记scikit-learn贝叶斯文本分类的坑
  15. 关于基因组注释文件GTF的解释
  16. [Android] Android Build 时报错: java.io.IOException: Could not parse XML from android/accounts/annotations.xml
  17. 【ABP.Net】2.多数据库支持&&初始化数据库
  18. Python接口自动化
  19. 第一节,windows和ubuntu下深度学习theano环境搭建
  20. JSP页面分页显示数据

热门文章

  1. Java中StringBuffer类
  2. python中文语料分词处理,按字或者词cut_sentence
  3. php时间:获取上一个月,本月天数,下一个月
  4. 【Django】runserver 0.0.0.0:0 后,究竟发生了什么
  5. IDEA 之 ERROR:无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]
  6. JS代码规范
  7. VR全景视图 Google VrPanoramaView
  8. 在okhttp的callback回调中加Toast出现Cant create handler inside hread that has not called Looper.prepare()...
  9. 翻译 - Kafka Streams 介绍(一)
  10. 12c DG broker DMON自动重启过程分析