Java学习笔记——设计模式之二.策略模式
明确是王道
——Clean Code
类图:

先定义策略类
package cn.no2.strategy;
public abstract class Strategy {
//省略属性
//算法方法
public abstract void algrithmInterface();
}
在定义若干策略子类
package cn.no2.strategy;
public class ConcreteStrategyA extends Strategy {
@Override
public void algrithmInterface() {
// TODO Auto-generated method stub
System.out.println("算法A实现");
}
}
public class ConcreteStrategyB extends Strategy {
@Override
public void algrithmInterface() {
// TODO Auto-generated method stub
System.out.println("算法B实现");
}
}
public class ConcreteStrategyC extends Strategy {
@Override
public void algrithmInterface() {
// TODO Auto-generated method stub
System.out.println("算法C实现");
}
}
最后定义业务逻辑"上下文类"
package cn.no2.strategy;
public class BizContext {
Strategy strategy = null;
public BizContext(String type) {
switch (type) {
case "策略A":
strategy= new ConcreteStrategyA();
break;
case "策略B":
strategy= new ConcreteStrategyB();
break;
case "策略C":
strategy= new ConcreteStrategyC();
break;
}
}
public void ContextInterface(){
strategy.algrithmInterface();
}
}
测试类
package cn.no2.strategy;
public class _Text {
public static void main(String[] args) {
BizContext biz;
biz = new BizContext("策略A");
biz.ContextInterface();
biz = new BizContext("策略B");
biz.ContextInterface();
biz = new BizContext("策略C");
biz.ContextInterface();
}
}
诚然,上面的程序只是明确了框架,并没有任何实际的业务逻辑.下面来写个需求
输入单价、数量、计价方式,其中计价方式就是策略:
策略1:正常收费
策略2:打X折
策略3:满X元减Y元
输出结果。
上代码:
Strategy类:
package cn.no2.strategy.instance;
public abstract class Strategy {
private double unitPrice;
private int count;
public double getUnitPrice() {
return unitPrice;
}
public void setUnitPrice(double unitPrice) {
this.unitPrice = unitPrice;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
//计算结果,返回double值
public abstract double algrithmInterface();
}
其子类:
package cn.no2.strategy.instance;
public class NomalStrategy extends Strategy {
@Override
public double algrithmInterface() {
// 使用清晰规范的代码,定义变量,计算,返回
double result = ;
result = this.getUnitPrice()*this.getCount();
return result;
}
}
public class DiscountStrategy extends Strategy {
private double discount;
public DiscountStrategy(double discount) {
super();
this.discount = discount;
}
@Override
public double algrithmInterface() {
// 这里重写方法不能传入参数,所以需要定义该子类特有的属性,折扣
double result = ;
result = this.getUnitPrice()*this.getCount()*discount;
return result;
}
}
public class FullReduceStrategy extends Strategy {
double full;
double reduction;
public FullReduceStrategy(double full, double reduction) {
super();
this.full = full;
this.reduction = reduction;
}
@Override
public double algrithmInterface() {
// TODO Auto-generated method stub
double result = this.getUnitPrice()*this.getCount();
if (result >= full) {
result -= reduction;
}
return result;
}
}
业务逻辑类:
package cn.no2.strategy.instance;
public class BizContext {
private Strategy strategy = null;
public BizContext(String type) {
switch (type) {
case "正常收费":
strategy= new NomalStrategy();
break;
case "打8.5折":
strategy= new DiscountStrategy(8.5);
break;
case "满300减100":
strategy= new FullReduceStrategy(,);
break;
}
}
//彻底封装Strategy类
public void initStrategy(double unitPrice,int count) {
strategy.setUnitPrice(unitPrice);
strategy.setCount(count);
}
//这里实现的对strategy的封装,调用者只调用BizContext自己的方法
public double ContextInterface(){
return strategy.algrithmInterface();
}
}
Test类:
package cn.no2.strategy.instance;
import java.util.Scanner;
public class _Text {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入单价:");
double unitPrice = sc.nextDouble();
System.out.println("请输入数量:");
int count = sc.nextInt();
System.out.println("请输入策略:(正常收费,打8.5折,满300减100)");//这里如果改动,只需增加BizContext的业务逻辑
String strategy = sc.next();
BizContext biz = new BizContext(strategy);
biz.initStrategy(unitPrice,count);
double result = biz.ContextInterface();
System.out.println("总价是:"+result);
sc.close();
}
}
以上是策略模式的实际应用
策略模式与简单工厂对比:
简单工厂模式:客户端传一个条件进工厂类,工厂类根据条件创建相应的产品类对象,客户端使用该产品类对象.工厂类依赖产品类
策略模式:客户端创建一个Context类对象,并通过传入参数使用该对象。Context类中聚合了产品类,没有依赖关系
Java学习笔记——设计模式之二.策略模式的更多相关文章
- Java学习笔记——设计模式之九.建造者模式
建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Product类: package cn.happy.design_pattern._09b ...
- Java进阶篇设计模式之十一 ---- 策略模式和模板方法模式
前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...
- Java进阶篇设计模式之二 ----- 工厂模式
前言 在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法.本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式.工厂方法和抽象工厂模式. 简单工厂模式 简单工厂模式是属于创建型模 ...
- JAVA中的设计模式三(策略模式)
问题: 如何让算法和对象分开来,使得算法可以独立于使用它的客户而变化? 方案: 把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就 ...
- 设计模式C++学习笔记之一(Strategy策略模式)
无意中,从网上下到一本电子书<24种设计模式介绍与6大设计原则>,很好奇这里有24种设计模式,印象中GOF写的<设计模式>(Design Patterns),好像只有23种吧. ...
- Java学习笔记——设计模式之八.外观模式
外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 子系统: package cn.happy.design_patter ...
- Java学习笔记——设计模式之四.代理模式
To be, or not to be: that is the question. --<哈姆雷特> 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. 上代码: p ...
- Java学习笔记——设计模式之七.模板方法模式
模板方法模式(TemplateMethod),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 结构图: 代码: 算法骨架 ...
- Java学习笔记——设计模式之六.原型模式(浅克隆和深克隆)
That there's some good in this world, Mr. Frodo. And it's worth fighting for. 原型模式(prototype),用原型实例指 ...
随机推荐
- 使用cmd命令打开Python文件式程序方法
首先:需要确定已编好的Python程序的存储路径:(即在哪个磁盘,哪个文件中) 其次:打开cmd命令,输入该程序所在磁盘,敲回车键:(例如其存储在E盘,则输入“E:”,敲回车键.) 然后:输入pyth ...
- SpringMVC参数校验(针对`@RequestBody`返回`400`)
SpringMVC参数校验(针对@RequestBody返回400) 前言 习惯别人帮忙做事的结果是自己不会做事了.一直以来,spring帮我解决了程序运行中的各种问题,我只要关心我的业务逻辑,设计好 ...
- Java日期格式化方法
首先获取当前系统时间的方法有两种:第一种可以用currentTimeMillis()方法获取,它其实产生的是一个当前的毫秒数,这个毫秒是自1970年1月1日0时起至现在的毫秒数,类型是long 型,可 ...
- 老李分享:jvm内存原型剖析
老李分享:jvm内存原型剖析 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9088214 ...
- redux计算器
//简单运用redux写了一个加减乘除功能 <!DOCTYPE html><html lang="en"><head> <meta cha ...
- lumen 中的 .env 配置文件简介和适用场景
lumen 是 laravel 的衍生品,核心功能的使用和 laravel 都是一致的,但配置文件这一方面,lumen 在 laravel 的基础上增加了更简便的配置方式: lumen 采用了 Dot ...
- AJAX载入外部JS文件到页面并让其执行的方法(附源码)
一. 向HTML页面中动态添加JS文件(从外部载入)并让其执行的两种方法 1.只适用于IE浏览器的简单方法: 先在文档中放置一张JS"空床"并添加ID:<script id= ...
- MAT(Memory Analyzer Tool)使用心得
起因:最近在跟踪产品的性能问题,期间主要问题体现在JVM的内存回收问题,使用MAT工具进行JVM内存分析(也可对android 的应用内存分析) 问题描述: 1.部分后端服务在运行一段时间后会突然年老 ...
- Tensorflow学习笔记---0--TensorBoard
运行mnist_with_summaries学习TensorBoard时,由于需要GPU支持,运行窗口报错:Couldn't open CUDA library cupti64_80.dll 解决办法 ...
- 关于在网页拼接时出现:提示Uncaught SyntaxError: missing ) after argument list;错误的原因分析
1:网页拼接不完善,可能哪里漏了:),},</XX>...等 2:如果有动态数据写入的话,请注意转义动态数据,如图(是转义后的内容,不会报错): 在写方法时:onclick中,注意单双引号 ...