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的更多相关文章

  1. 设计模式课程 设计模式精讲 13-2 享元模式coding

    1 代码演练 1.1 代码演练1 1 代码演练 1.1 代码演练1 需求: 每周由随机部门经历做报告: 重点关注: a 该案例是单例模式和享元模式共同使用 b 外部传入的department是外部状态 ...

  2. 设计模式课程 设计模式精讲 11-2 装饰者模式coding

    1 代码演练 1.1 代码演练1(未使用装饰者模式) 1.2 代码演练2(使用装饰者模式) 1 代码演练 1.1 代码演练1(未使用装饰者模式) 需求: 大妈下班卖煎饼,加一个鸡蛋加一元,一个火腿两元 ...

  3. 设计模式课程 设计模式精讲 7-2 建造者模式Coding

    1 代码演练 1.1 建造者模式演练 1.2 静态内部类演练建造者模式(链式调用) 1 代码演练 1.1 建造者模式演练 需求: 根据讲师提供的课程名称,课程ppt,课程视频,课程手记,课程问答 制作 ...

  4. 设计模式课程 设计模式精讲 17-2 模板方法模式coding

    1 代码演练 1.1 代码演练1 1.2 代码演练2(后端课程子类运用钩子方法,加入写手记的方法) 1.3 代码演练3(前端有多个子类,有得需要写手记,有得不需要写,如何实现?) 1 代码演练 1.1 ...

  5. 《Head First 设计模式》读书笔记(1) - 策略模式

    <Head First 设计模式>(点击查看详情) 1.写在前面的话 之前在列书单的时候,看网友对于设计模式的推荐里说,设计模式的书类别都大同小异,于是自己就选择了Head First系列 ...

  6. PHP 设计模式 笔记与总结(8)策略模式

    ① 策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式. ② 实际应用举例,假如一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示 ...

  7. CSharp设计模式读书笔记(22):策略模式(学习难度:★☆☆☆☆,使用频率:★★★★☆)

    策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy). 模式角色与结构: ...

  8. 设计模式课程 设计模式精讲 6-2 抽象工厂coding

    1 代码讲解 1.1 抽象工厂优点 1.2 抽象工厂缺点 1.3 为何有产品族的业务场景宜用抽象工厂设计模式?而不是工厂设计模式? 2 代码演练 2.1 抽象工厂代码演练 1 代码讲解 1.1 抽象工 ...

  9. 设计模式课程 设计模式精讲 18-2 迭代器模式coding

    1 代码演练 1.1 代码演练1(迭代器模式演练) 1.2 代码使用场景 1 代码演练 1.1 代码演练1(迭代器模式演练) 需求: 课程管理:需要实现课程可进行增添,删除,并能够打印出课程列表. u ...

随机推荐

  1. Scrapy 命令

    Scrapy提供了两种类型的命令.一种必须在Scrapy项目中运行(针对项目(Project-specific)的命令),另外一种则不需要(全局命令).全局命令在项目中运行时的表现可能会与在非项目中运 ...

  2. SaaS paas iaas是什么

    saas:软件即服务,必须对云服务商的定价及合同 条款进行仔细审查保证其安全性,如果存在纠纷云商切断服务话企业可能立马面临困境. paas:平台即服务 iaas :基础架构即服务.

  3. Codeforces Round #601 (Div. 2)E(寻找质因子,DP)

    先分解质因数,对于当前a[i],假设当前的质因数为x,这个位置要满足能被k整除,有两个可能,要么是它向后一个转移x%k个,要么是后一个向它转移k-x%k个. 对于每一个a[i]满足后,因为只会对下一个 ...

  4. 【PAT甲级】1090 Highest Price in Supply Chain (25 分)

    题意: 输入一个正整数N(<=1e5),和两个小数r和f,表示树的结点总数和商品的原价以及每向下一层价格升高的幅度.下一行输入N个结点的父结点,-1表示为根节点.输出最深的叶子结点处购买商品的价 ...

  5. 【C语言】判断某一正整数是否为完数

    什么是完数? 如果一个数等于它的因子之和,则称该数为“完数”(或“完全数”). 例如,6的因子为1.2.3,而 6=1+2+3,因此6是“完数”. 程序框图:m  问题分析 根据完数的定义,解决本题的 ...

  6. HTML去除多余空白区域的方法

    在head标记中添加html,body{height:100%;}即可. 实例如下 <head><style>html,body{height:90%;}</style& ...

  7. 惠普台式机,如何选择U盘启动

    开机先连续点击键盘F9按键进入选择启动盘界面,找到自己的U盘(KingstonDataTraveler 3.0)

  8. AgileReview 代码检视工具使用

    AgileReview 它是一个eclipse插件. http://www.agilereview.org/ 官网地址. 四种下载插件方式. 1.Marketplace QuickInstall    ...

  9. Java面向对象编程 -3.2

    使用this调用本类方法 除了调用属性之外,this也可以实现方法的调用,但是对于方法的调用就必须考虑构造与普通方法 构造方法调用(this()):使用关键字new实例化对象的时候才会调用构造方法: ...

  10. Fiddler一次性发多个请求

    Fiddler一次发送多个请求 选中某个请求: 选中 : Raw, 将request数据拷出: 包含请求header和request body 替换request header里面的ASP.NET_S ...