设计模式课程 设计模式精讲 19-2 策略模式coding
1 代码演练
1.1 代码演练1(多态)
1.2 代码演练2(优化应用)
1.3 代码演练3(策略模式结合工厂模式)
1 代码演练
1.1 代码演练1(多态)
需求:
木木网卖课程,为了促进销售,618实行买课程立减10元,双十一实行满50减10元,还有返现的优惠(这个活动还没有开始)。请实现它
uml类图:
测试类:
package com.geely.design.pattern.behavioral.strategy; public class TestStrategy {
public static void main(String [] args){
PromotionActivity promotionActivityLJ = new PromotionActivity(new LiJianPromotionStrategy());
PromotionActivity promotionActivityMJ = new PromotionActivity(new ManJianPromotionStrategy()); promotionActivityLJ.execute();
promotionActivityMJ.execute();
}
}
应用层:
package com.geely.design.pattern.behavioral.strategy; public class PromotionActivity {
private PromotionStrategy promotionStrategy;
public PromotionActivity(PromotionStrategy promotionStrategy) {
this.promotionStrategy = promotionStrategy;
} public void execute(){
promotionStrategy.doPromotion();
}
}
实现类1:
package com.geely.design.pattern.behavioral.strategy; public class LiJianPromotionStrategy implements PromotionStrategy {
@Override
public void doPromotion() {
System.out.println("立减10元");
}
}
实现类2:
package com.geely.design.pattern.behavioral.strategy; public class ManJianPromotionStrategy implements PromotionStrategy {
@Override
public void doPromotion() {
System.out.println("满50元减10元");
}
}
实现类3:
package com.geely.design.pattern.behavioral.strategy; public class FanXianPromotionStrategy implements PromotionStrategy {
@Override
public void doPromotion() {
System.out.println("返现10元到木木网");
}
}
接口:
package com.geely.design.pattern.behavioral.strategy; /**
* 初始接口
*/
public interface PromotionStrategy {
void doPromotion();
}
打印日志:
立减10元
满50元减10元 Process finished with exit code 0
1.2 代码演练2(优化应用类)
测试类优化:
package com.geely.design.pattern.behavioral.strategy; import org.apache.commons.lang.StringUtils; public class TestStrategy { public static void main(String [] args){
PromotionActivity promotionActivity = null;
String promotionKey = "ManJian"; if(StringUtils.equals(promotionKey,"LiJian")){
promotionActivity = new PromotionActivity(new LiJianPromotionStrategy());
}else if(StringUtils.equals(promotionKey,"ManJian")){
promotionActivity = new PromotionActivity(new ManJianPromotionStrategy());
}
promotionActivity.execute();
}
}
1.3 代码演练3(策略模式结合工厂模式)
目的:
a 将参数设置成可以配置的,简化以后维护的成本
b 取消大量的if...else...应用
测试类:
package com.geely.design.pattern.behavioral.strategy; import org.apache.commons.lang.StringUtils; /**
* add by ddwei 20200213
*/
public class TestStrategy {
//demo 1 常规多态实现
/* public static void main(String [] args){
PromotionActivity promotionActivity618 = new PromotionActivity(new FanXianPromotionStrategy());
PromotionActivity promotionActivity1111 = new PromotionActivity(new LiJianPromotionStrategy());
promotionActivity1111.executePromotion();
promotionActivity618.executePromotion();
}*/ //demo 2 正常程序不可避免 的使用if else
/*public static void main(String [] args){
String promotionStrategy = "LIJIAN";
PromotionActivity promotionActivity = null;
if(StringUtils.equals(promotionStrategy,"LIJIAN")){
promotionActivity = new PromotionActivity(new LiJianPromotionStrategy());
}else if(StringUtils.equals(promotionStrategy,"FANXIAN")){
promotionActivity = new PromotionActivity(new FanXianPromotionStrategy());
} //...
promotionActivity.executePromotion();
}*/ //demo 3 结合工厂模式 ,策略模式推进 ,不再使用if else
public static void main(String [] args){
//String promotionStrategy = "LIJIAN";
//String promotionStrategy = "FANXIAN";
String promotionStrategy = "LIJIAN3";
PromotionStrategy iPromotionStrategy = PromotionFactory.getPromotionStrategy(promotionStrategy);
PromotionActivity promotionActivity = new PromotionActivity(iPromotionStrategy);
promotionActivity.executePromotion();
} }
核心类(策略模式结合工厂模式):
package com.geely.design.pattern.behavioral.strategy; import java.util.HashMap;
import java.util.Map; /**
* 策略工厂
*/
public class PromotionFactory { private static Map<String,PromotionStrategy> promotionStrategyHashMap= new HashMap<String, PromotionStrategy>();
//静态代码块 HashMap放值
static{
promotionStrategyHashMap.put(IPromotionConfigtation.MANJIAN,new ManJianPromotionStrategy());
promotionStrategyHashMap.put(IPromotionConfigtation.LIJIAN,new LiJianPromotionStrategy());
promotionStrategyHashMap.put(IPromotionConfigtation.FANXIAN,new FanXianPromotionStrategy());
} /**
* 主方法
* 根据传入的策略key值 查询到相应的策略.
* 如果未查到相应的key值返回空策略,目的是避免出现空指针异常的情况
* 从根本上代替了if...else 的功能
* @param promotionKey
* @return
*/
public static PromotionStrategy getPromotionStrategy(String promotionKey){
PromotionStrategy EMPTYPROMOTIONSTRATEGY = new EmptyPromotionStrategy();
return promotionStrategyHashMap.containsKey(promotionKey)?promotionStrategyHashMap.get(promotionKey):EMPTYPROMOTIONSTRATEGY;
} /**
* 后期维护入口:
* 内部类,放入配置参数
*/
interface IPromotionConfigtation{
String MANJIAN = "MANJIAN";
String LIJIAN = "LIJIAN";
String FANXIAN = "FANXIAN";
} //禁止外部调用构造函数来创建对象
public PromotionFactory() {
}
}
促销活动类:
package com.geely.design.pattern.behavioral.strategy; /**
* 促销应用类
* add by ddwei 20200213
*/
public class PromotionActivity {
//有参构造传值
private PromotionStrategy promotionStrategy; public PromotionActivity(PromotionStrategy promotionStrategy) {
this.promotionStrategy = promotionStrategy;
} //调用执行策略方法
public void executePromotion(){
promotionStrategy.doPromotion();
} }
子类空策略类:
package com.geely.design.pattern.behavioral.strategy; /**
* 空策略
*/
public class EmptyPromotionStrategy implements PromotionStrategy {
@Override
public void doPromotion() {
System.out.println("todo 无相应的优惠!");
}
}
子类满减类:
package com.geely.design.pattern.behavioral.strategy; public class ManJianPromotionStrategy implements PromotionStrategy {
@Override
public void doPromotion() {
System.out.println("todo 实现满减逻辑");
}
}
子类立减类:
package com.geely.design.pattern.behavioral.strategy; public class LiJianPromotionStrategy implements PromotionStrategy {
@Override
public void doPromotion() {
System.out.println("todo 实现立减逻辑");
}
}
子类返现类:
package com.geely.design.pattern.behavioral.strategy; public class FanXianPromotionStrategy implements PromotionStrategy {
@Override
public void doPromotion() {
System.out.println("todo 实现返现逻辑");
}
}
父类策略接口:
package com.geely.design.pattern.behavioral.strategy; /**
* 促销通用接口
* add by ddwei 20200213
*/
public interface PromotionStrategy {
void doPromotion();
}
打印结果:
todo 无相应的优惠! Process finished with exit code 0
设计模式课程 设计模式精讲 19-2 策略模式coding的更多相关文章
- 设计模式课程 设计模式精讲 13-2 享元模式coding
1 代码演练 1.1 代码演练1 1 代码演练 1.1 代码演练1 需求: 每周由随机部门经历做报告: 重点关注: a 该案例是单例模式和享元模式共同使用 b 外部传入的department是外部状态 ...
- 设计模式课程 设计模式精讲 11-2 装饰者模式coding
1 代码演练 1.1 代码演练1(未使用装饰者模式) 1.2 代码演练2(使用装饰者模式) 1 代码演练 1.1 代码演练1(未使用装饰者模式) 需求: 大妈下班卖煎饼,加一个鸡蛋加一元,一个火腿两元 ...
- 设计模式课程 设计模式精讲 7-2 建造者模式Coding
1 代码演练 1.1 建造者模式演练 1.2 静态内部类演练建造者模式(链式调用) 1 代码演练 1.1 建造者模式演练 需求: 根据讲师提供的课程名称,课程ppt,课程视频,课程手记,课程问答 制作 ...
- 设计模式课程 设计模式精讲 17-2 模板方法模式coding
1 代码演练 1.1 代码演练1 1.2 代码演练2(后端课程子类运用钩子方法,加入写手记的方法) 1.3 代码演练3(前端有多个子类,有得需要写手记,有得不需要写,如何实现?) 1 代码演练 1.1 ...
- 《Head First 设计模式》读书笔记(1) - 策略模式
<Head First 设计模式>(点击查看详情) 1.写在前面的话 之前在列书单的时候,看网友对于设计模式的推荐里说,设计模式的书类别都大同小异,于是自己就选择了Head First系列 ...
- PHP 设计模式 笔记与总结(8)策略模式
① 策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式. ② 实际应用举例,假如一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示 ...
- CSharp设计模式读书笔记(22):策略模式(学习难度:★☆☆☆☆,使用频率:★★★★☆)
策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy). 模式角色与结构: ...
- 设计模式课程 设计模式精讲 6-2 抽象工厂coding
1 代码讲解 1.1 抽象工厂优点 1.2 抽象工厂缺点 1.3 为何有产品族的业务场景宜用抽象工厂设计模式?而不是工厂设计模式? 2 代码演练 2.1 抽象工厂代码演练 1 代码讲解 1.1 抽象工 ...
- 设计模式课程 设计模式精讲 18-2 迭代器模式coding
1 代码演练 1.1 代码演练1(迭代器模式演练) 1.2 代码使用场景 1 代码演练 1.1 代码演练1(迭代器模式演练) 需求: 课程管理:需要实现课程可进行增添,删除,并能够打印出课程列表. u ...
随机推荐
- 【应急响应】Windows 安全加固
一.补丁管理 运行cmd,输入systeminfo查看目前补丁信息 二.账户管理 gpedit.msc —>Windows设置—>安全设置—>本地设置—>账户设置 密码策略: ...
- 解决tensorflow Saver.restore()无效的问题
解决tensorflow 的 Saver.restore()无法从本地读取变量的问题 最近做tensorflow 手写数字识别的时候遇到了一个问题,Saver的restore()方法无法从本地恢复变量 ...
- ubuntu磁盘分配和挂载
Linux(ubuntu)可以把分区作为挂载点,常用的几个挂载点.作用及一般应该分配的磁盘空间如下表所示: Markdown Extra 表格语法: 挂载点(目录) 建议大小 格式 作用 / 20G左 ...
- 【原】django实现列表分页功能
在view.py里添加分页查询方法: from django.http import JsonResponse from django.views.decorators.http import req ...
- Java数组和方法
1. 数组可以作为方法的参数 package cn.itcast.day05.demo04; /* 数组可以作为方法的参数. 当调用方法的时候,向方法的小括号进行传参,传递进去的其实是数组的地址值. ...
- C++基础之迭代器iterator
C++基础之迭代器iterator 我们已经知道可以使用下标运算符来访问string对象的字符或vector对象的元素,还有另一种更通用的机制也可以实现同样的目的,这就是迭代器(iterator). ...
- 世界协调时间(UTC)与中国标准时间
整个地球分为二十四时区,每个时区都有自己的本地时间.在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated).UTC与格 ...
- cf 76 div2
传送门 题意 t组样例 n个学生, x最多交换次数 a交换的第一个位置 b交换的第二个位置 最多是交换n-1次,不懂的话可以找个数列自己模拟一下: 然后其他的就是abs(a-b)+x;两个位置之间的距 ...
- 吴裕雄--天生自然TensorFlow2教程:梯度下降简介
import tensorflow as tf w = tf.constant(1.) x = tf.constant(2.) y = x * w with tf.GradientTape() as ...
- Java学习资源 - J2SE
java.lang包教程 Java集合类详解 Java回顾之集合 Java回顾之序列化 Java回顾之反射 深入理解Java:类加载机制及反射 Java 下高效的反射工具包 ReflectASM 使用 ...