设计模式课程 设计模式精讲 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 ...
随机推荐
- zookeeper 源码(一) 选举和同步数据
前言 在开始阅读代码前我们先来了解一下zk 的大致结构,具体大概要实现的核心功能有那些,心中有个大概的框架阅读代码时再深入其中的细节,就会非常好懂,本人觉得这是一个阅读源码的好方法,可以最快地切入到源 ...
- 7,请描述下cookies,sessionStorage和localStorage的区别
7,请描述下cookies,sessionStorage和localStorage的区别 首先,cookie是网站为了标识用户身份而储存在用户本地终端(client side,百科: 本地终端指与计算 ...
- hadoop中block副本的放置策略
下面的这种是针对于塔式服务器的副本的放置策略
- Centos610快照克隆后网络配置
VMware中安装的Centos610快照并克隆后网络配置 1.网卡配置 vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 HWADDR ...
- Fluent_Python_Part3函数即对象,06-dp-1class-func,一等函数与设计模式
使用一等函数实现设计模式 中文电子书P278 合理利用作为一等对象的函数,把模式中涉及的某些类的实例替换成简单的函数,从而简化代码. 1. 重构"策略"模式 中文电子书P282 P ...
- vue-lazyload 的使用(vue图片懒加载)
github地址:https://github.com/hilongjw/vue-lazyload npm i vue-lazyload -S 或者 <script src="http ...
- Windows 查看并关闭占用指定端口的程序
windows关闭端口的小工具: 链接:https://pan.baidu.com/s/1ZGL4cdSluy0lbi3tDERUvA 提取码:spxy 查看指定端口的使用情况 netstat -an ...
- 《Web安全攻防 渗透测试实战指南》 学习笔记 (二)
Web安全攻防 渗透测试实战指南 学习笔记 (二) 第二章 漏洞环境及实践
- np.multiply
用法:np.multiply(x1,x2),作用:逐元素相乘,若x1和x2均为标量,则返回标量 x1=np.array([,,]) x2=np.array([,,]) np.multiply(x1,x ...
- Beego Learning Notes
Beego框架学习 1.1软件框架 一个公司是由公司中的各部部门来组成的,每一个部门拥有特定的职能,部门与部门之间通过相互的配合来完成让公司运转起来. 一个软件框架是由其中各个软件模块组成的,每一个模 ...