Strategy 设计模式 策略模式 超靠谱原代码讲解
先来假设一种情,我们需要向三种不同的客户做出不同的报价,一般来说要肿么设计呢,是不是马上会想到用IF,没有错,对于这种情况,策略模式是最好的选。大家可以这么理解,如果有情况需要用到大量的IF,那你用策略模式就一定没有错了。好了,不多说,直接上代码
先建一个Customer,放三种不同的客户类型
package Customer;
import Inter.Strategy;
public class LargeCustomer implements Strategy{
public double calcPrice(double goodsPrice){
System.out.println("对于大客户,统一折扣10%");
return goodsPrice*(1-0.1);
}
}
package Customer;
import Inter.Strategy;
public class NormalCustomer implements Strategy{
/**
*
* 具体算法的实现,为VIP1计算价格
*
* */
public double calcPrice(double goodsPrice){
System.out.println("对于新客户或是普通客户,没有折扣");
return goodsPrice;
}
}
package Customer;
import Inter.Strategy;
public class oldCustomer implements Strategy{
public double calcPrice(double goodsPrice){
System.out.println("对于老客户,统一折扣5%");
return goodsPrice*(1-0.05);
}
}
再建一个接口Inter
package Inter;
public interface Strategy {
/*
*
*
* **/
public double calcPrice(double goodsPrice);
}
再来一个实现业务的报价系统
package Price;
import Inter.Strategy;
public class Price {
private Strategy strategy = null;
public Price (Strategy aStrategy){
this.strategy = aStrategy;
}
public double quote(double goodsPrice){
return this.strategy.calcPrice(goodsPrice);
}
}
是不是很简单,接下来就可以调式了
package Test; import Customer.LargeCustomer;
import Inter.Strategy;
import Price.Price; public class Clients { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub //实例化并使用LargeCustomer策略装载到策略器strategy当中
Strategy strategy = new LargeCustomer(); //实例化报价者ctx,然后把已经装有策略的策略器strategy给它
Price ctx = new Price(strategy); //正式给报价者ctx输值2000,CTX会跟据已经装有策略的的策略器去执行策略,得出来的值塞给quote,其实不塞进接用该函数也可以显示值,大家懂的
double quote = ctx.quote(2000); System.out.println("向客户报价:" + quote); } }
Strategy 设计模式 策略模式 超靠谱原代码讲解的更多相关文章
- [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)
[.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...
- 设计模式 | 策略模式(strategy)
参考:https://www.cnblogs.com/lewis0077/p/5133812.html(深入解析策略模式) 定义: 策略模式定义了一系列的算法,并将每一个算法封装起来,使每个算法可以相 ...
- javascript设计模式——策略模式
前面的话 在程序设计中,常常遇到类似的情况,要实现某一个功能有多种方案可以选择.比如一个压缩文件的程序,既可以选择zip算法,也可以选择gzip算法.这些算法灵活多样,而且可以随意互相替换.这种解决方 ...
- [转]js设计模式-策略模式
在程序设计中,常常遇到类似的情况,要实现某一个功能有多种方案可以选择.比如一个压缩文件的程序,既可以选择zip算法,也可以选择gzip算法.这些算法灵活多样,而且可以随意互相替换.这种解决方案就是本文 ...
- PHP设计模式-策略模式 转
策略模式(Strategy Pattern) 策略模式是对象的行为模式,用意是对一组算法的封装.动态的选择需要的算法并使用. 策略模式指的是程序中涉及决策控制的一种模式.策略模式功能非常强大,因为这个 ...
- 15. 星际争霸之php设计模式--策略模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型)
[.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它 ...
- linkin大话设计模式--策略模式
linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi] 策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...
- JS设计模式——策略模式
设计模式高大上,业务代码用不上...平时用不上我们就可以忽略了吗? 非也,就像面试造火箭,工作拧螺丝一样.万一我们公司哪天要造火箭了,你得立马能上手. 同时,有些复杂的业务代码也可以用设计模式的思想去 ...
随机推荐
- thinkphp零碎小知识
在使用thinkphp搭建后台的时候,有很多的参数需要去配置,有的记不住还要去查找,这里把一些基本的参数整理一下,还有些零碎的知识点,与大家共勉,希望能方便大家. 友情提示:这些配置是 thinkph ...
- python学习之路前端-CSS
CSS概述 css是英文Cascading Style Sheets的缩写,称为层叠样式表,用于对页面进行美化. 存在方式有三种:元素内联.页面嵌入和外部引入,比较三种方式的优缺点. 语法:style ...
- Linux 新系统个人配置
1,装codeblocks 2,装vim,检查gcc,g++,修改vim环境 cd ~vim .vimrc添加如下几行:set shiftwidth=4 (表示每一级缩进的长度)s ...
- ScalaPB(1): using protobuf in akka
任何类型的实例作为消息在两端独立系统的机器之间进行传递时必须经过序列化/反序列化serialize/deserialize处理过程.假设以下场景:在一个网络里有两台连接的服务器,它们分别部署了独立的a ...
- CentOS7: How to resolve curl#56 - "Recv failure: Connection reset by peer"
Issue: When you execute Yum installation or update, you may encounter following error: Loaded plugin ...
- How To determine DDIC Check Table, Domain and Get Table Field Text Data For Value?
How To determineDDIC Check Table, Domain and Get Table Field Text Data For Value? 1.Get Table Fie ...
- 《Java多线程编程核心技术》推荐
写这篇博客主要是给猿友们推荐一本书<Java多线程编程核心技术>. 之所以要推荐它,主要因为这本书写得十分通俗易懂,以实例贯穿整本书,使得原本抽象的概念,理解起来不再抽象. 只要你有一点点 ...
- logstash处理文件进度记录机制
假如使用如下配置处理日志 input { file { path => "/home/vagrant/logstash/logstash-2.2.2/dbpool-logs/dev/c ...
- 漏洞挖局利器-Fuzz技术介绍
模糊测试的定义 模糊测试定义为"通过向应用提供非预期的输入并监控输出中的异常来发现软件中的故障(faults)的方法". 典型而言,模糊测试利用自动化或是半自动化的方法重复地向应用 ...
- 编译GDAL支持OpenCL使用GPU加速
前言 GDAL库中提供的gdalwarp支持各种高性能的图像重采样算法,图像重采样算法广泛应用于图像校正,重投影,裁切,镶嵌等算法中,而且对于这些算法来说,计算坐标变换的运算量是相当少的,绝大部分运算 ...