IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 设计模式之策略模式 -> 正文阅读

[Java知识库]设计模式之策略模式

1,目标

通过学习策略模式来消除代码中的大量的if...else...和switch语句

深刻理解策略模式的应用场景,提高算法的保密性和安全性。

2,定位

希望通过对策略模式的学习,来消除程序中的大量的冗余代码和多重转移语句

3,策略模式的定义

策略模式(Strategy pattern)是指定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化不会影响到使用算法的用户。可以避免多重分支的if...else...和switch语句。

4,策略模式的适用场景

1,假如系统中有很多类,而他们的区别仅仅在于他们的行为不同。

2,一个系统需要动态地在几种算法中选择一种。

5,策略模式代码实现方法

我们按照培训机构卖课做为例子,首先创建一个培训课程的促销接口PromotionStrategy.java类

package com.packer.partten.strategy.promotion;

/**
 * Created by lijianfang on 2021/10/3.
 */
public interface PromotionStrategy {
    void doPromotion();
}

再分别创建各种促销实现类,CashbackStrategy.java促销返现类

package com.packer.partten.strategy.promotion;

/**
 * Created by lijianfang on 2021/10/3.
 */
public class CashbackStrategy implements PromotionStrategy {
    @Override
    public void doPromotion() {
        System.out.println("返现促销,返现后的价格转到支付宝");
    }
}

培训机构发放优惠卷类CouponStrategy.java

package com.packer.partten.strategy.promotion;

/**
 * Created by lijianfang on 2021/10/3.
 */
public class CouponStrategy implements PromotionStrategy {
    @Override
    public void doPromotion() {
        System.out.println("领优惠券,课程后的价格");
    }
}

正常的无促销的类EmptyStrategy.java

package com.packer.partten.strategy.promotion;

/**
 * Created by lijianfang on 2021/10/3.
 */
public class EmptyStrategy implements PromotionStrategy {
    @Override
    public void doPromotion() {
        System.out.println("无促销活动");
    }
}

团购的类GroupbuyStrategy.java

package com.packer.partten.strategy.promotion;

/**
 * Created by lijianfang on 2021/10/3.
 */
public class GroupbuyStrategy implements PromotionStrategy {
    @Override
    public void doPromotion() {
        System.out.println("组团,满20人成团,全团享受团购价");
    }
}

再创建一个活动发布类PromotionAvtivity.java,通过发布的活动中的构造方法得到不同的优惠活动,通过execute方法执行具体的活动优惠力度。

package com.packer.partten.strategy.promotion;

/**
 * Created by lijianfang on 2021/10/3.
 */
public class PromotionAvtivity {
    PromotionStrategy promotionStrategy;

    public PromotionAvtivity(PromotionStrategy promotionStrategy){
        this.promotionStrategy = promotionStrategy;
    }

    public void execute(){
        this.promotionStrategy.doPromotion();
    }
}

最后再做一个测试类PromotionAvtivityTest.java

package com.packer.partten.strategy.promotion;

/**
 * Created by lijianfang on 2021/10/3.
 */
public class PromotionAvtivityTest {
    public static void main(String[] args) {
        PromotionAvtivity avtivity618 = new PromotionAvtivity(new CouponStrategy());
        PromotionAvtivity avtivityGroup = new PromotionAvtivity(new GroupbuyStrategy());
        avtivity618.execute();
        avtivityGroup.execute();
    }
}

我们看一下测试的结果。

领优惠券,课程后的价格
组团,满20人成团,全团享受团购价

Process finished with exit code 0

按照正常我们代码中使用写的话,应该使用下面的方式进行调用。?

package com.packer.partten.strategy.promotion;

/**
 * Created by lijianfang on 2021/10/3.
 */
public class PromotionAvtivityTest {   
 public static void main(String[] args) {
        PromotionAvtivity promotionAvtivity = null;
        String promotionKey = "COUPON";
        if(promotionKey.equals("COUPON")){
            promotionAvtivity = new PromotionAvtivity(new CouponStrategy());
        }else if(promotionKey.equals("CASHBACK")){
            promotionAvtivity = new PromotionAvtivity(new CashbackStrategy());
        }//.....
        promotionAvtivity.execute();
    }
}

?测试结果如下:

组团,满20人成团,全团享受团购价

Process finished with exit code 0

上面的代码还是有冗余,我们结合之前的工厂模式进行改造一下。

新建一个PromotionStrategyFactory.java类

package com.packer.partten.strategy.promotion;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by lijianfang on 2021/10/3.
 */
public class PromotionStrategyFactory {
    private static Map<String,PromotionStrategy> PROMOTION_STRATEGY_MAP = new HashMap<String, PromotionStrategy>();
    static {
        PROMOTION_STRATEGY_MAP.put(PromotionKey.CASHBACK,new CashbackStrategy());
        PROMOTION_STRATEGY_MAP.put(PromotionKey.COUPON,new CouponStrategy());
        PROMOTION_STRATEGY_MAP.put(PromotionKey.GROUPBUY,new GroupbuyStrategy());
    }
    private static final PromotionStrategy  NON_PROMOTION = new EmptyStrategy();
    private PromotionStrategyFactory(){}
    public static PromotionStrategy getPromotionStrategy(String promotionKey){
        PromotionStrategy promotionStrategy =  PROMOTION_STRATEGY_MAP.get(promotionKey);
        return promotionStrategy == null?NON_PROMOTION:promotionStrategy;
    }

    private interface PromotionKey{
        String COUPON = "COUPON";
        String CASHBACK = "CASHBACK";
        String GROUPBUY = "GROUPBUY";
        String EMPTY = "EMPTY";
    }
}

测试方法如下:

package com.packer.partten.strategy.promotion;

/**
 * Created by lijianfang on 2021/10/3.
 */
public class PromotionAvtivityTest {

    public static void main(String[] args) {
        String promotionKey = "GROUPBUY";
        PromotionAvtivity promotionAvtivity = new PromotionAvtivity(PromotionStrategyFactory.getPromotionStrategy(promotionKey));
        promotionAvtivity.execute();
    }
}

测试结果如下:

组团,满20人成团,全团享受团购价

Process finished with exit code 0

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-04 12:43:31  更:2021-10-04 12:44:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 18:37:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码