我是靠谱客的博主 合适高山,最近开发中收集的这篇文章主要介绍【源码分析设计模式 11(1),Java开发框架,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

4、注意事项


如果一个系统的策略多于四个,就需要考虑使用混合模式解决策略类膨胀的问题

640?wx_fmt=jpeg

四、代码实例

==========

下面就以商场促销为例使用策略模式实现商场促销算法。UML图如下:

1、上下文类


首先声明一个 CashSuper 对象,通过构造方法,传入具体的收费策略, getResult() 方法的功能为根据收费策略的不同获取计算结果。


package designMode.strategy;



public class CashContext {

    private CashSuper cashSuper;



    public CashContext(CashSuper cashSuper) {

        this.cashSuper = cashSuper;

    }



    public double getResult(double money){

        return cashSuper.acceptCash(money);

    }

}

2、现金收费抽象类


策略类,为抽象类,抽象出收费的方法供子类实现。


package designMode.strategy;



public abstract class CashSuper {

    public abstract double acceptCash(double money);

}

3、正常收费子类



package designMode.strategy;



public class CashNormal extends CashSuper {

    @Override

    public double acceptCash(double money) {

        return money;

    }

}

4、打折收费子类



package designMode.strategy;



public class CashRebate extends CashSuper {

    private double moneyRebate = 0.8;



    public CashRebate(double moneyRebate) {

        this.moneyRebate = moneyRebate;

    }



    @Override

    public double acceptCash(double money) {

        return money*moneyRebate;

    }

}

5、返利收费子类



package designMode.strategy;



public class CashReturn extends  CashSuper {

    private double moneyConditation = 0.0;

    private double moneyReturn = 0.0d;



    public CashReturn(double moneyConditation, double moneyReturn) {

        this.moneyConditation = moneyConditation;

        this.moneyReturn = moneyReturn;

    }



    @Override

    public double acceptCash(double money) {

        double result = money;

        if(money>moneyConditation){

            result = money-Math.floor(money/moneyConditation)*moneyReturn;

        }

        return result;

    }

}

6、client客户端



package designMode.strategy;



import java.util.Scanner;



public class Client {

    public static void main(String[] args) {

        CashContext cashContext = null;

        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入打折方式(1/2/3):");

        int in = scanner.nextInt();

        String type = "";

        switch (in){

            case 1:

                cashContext = new CashContext(new CashNormal());

                type += "正常收费";

                break;

            case 2:

                cashContext = new CashContext(new CashReturn(300,100));

                type +="满300返100";

                break;

            case 3:

                cashContext = new CashContext(new CashRebate(0.8));

                type += "打八折";

                break;

            default:

                System.out.println("请输入1/2/3");

                break;

        }

        double totalPrices = 0;

        System.out.print("请输入单价:");

        double price = scanner.nextDouble();

        System.out.println("请输入数量:");

        double num = scanner.nextDouble();

        totalPrices = cashContext.getResult(price * num);

        System.out.println("单价:" + price + ",数量:" + num + ",类型:" + type + ",合计:" + totalPrices);

        scanner.close();

    }

}

7、运行结果


五、策略模式与工程模式的区别

==================

1、策略模式是行为性模式,适应行为的变化 ,强调父类的调用子类的特性 。

工厂模式是创建型模式,适应对象的变化,强调统一接口 。

2、策略模式封装行为,调用的时候必须先制定实例化具体的类,再调用抽象的方法; 策略模式的作用是让一个对象在许多行为中选择一种行为。

工厂模式封装对象,实例化对象后调用的时候要知道具体的方法。

3、策略模式是调用不同类方法, 工厂模式是对父类进行重写。

这俩个模式本来就是解决类似的问题,可以说是孪生兄弟,且内部实现都差不多,都是通过子类来覆盖父类而已,不过简单工厂是把父类直接摆在客户端,而策略模式是将父类隐藏在Context里面,这样封装更好。

4、举个例子

(1)产品之于加减乘除,水果之于苹果梨橘子香蕉,文具之于笔尺刀,这时产品比较具体、有限和没有多个算法重叠,这时实用简单工厂模式。

(2)产品之于商场促销中的返利(可为300返100、500返200、10000返500等等无数)、折扣(2折、2.5折、6折、9折、9.1折等等无数)、正常购买、消费积分(100元10积分、200元30积分等等无数),这时产品构造又多次重叠,且有在不同时刻应用不同的规则时使用策略模式。

5、总结

简单工厂模式只是解决了对象的创建问题,工厂需要包括所有的产品对象的创建,如果产品对象形式经常变化,就需要经常改动工厂,以致代码重新编译。所以策略模式就诞生了,策略模式—它定义了算法家族,分别封装起来,而不是像简单产品模式一样定义所有的产品类,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户,使客户拥有相同的访问过程。

简单工厂模式的核心是“简单工厂模式就是用来封装所有的产品对象的”。

策略模式理解核心是“策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中遇到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性”。

在基本的策略模式中,选择所用的具体实现的算法的职责由客户端对象承担,并转给策略模式的Context对象。这是策略模式本身纯粹的定义,所以,“选择所用最终怎样处理”还有很多文章可做。

看了课本之后对于这两个模式还是有很多不理解的地方,但是相信随着对设计模式进一步的学习,能够更好地体会到这其中的奥妙,学习是一个循序渐进的过程。

六、SpringMVC中的策略模式

=================

1、getDefaultStrategies


在DispatchServlet中的初始化组件中,用到了getDefaultStrategies方法,来决定不同组件的默认类型以实现组件的初始化操作。


// 传入ApplicationContext上下文和策略接口的Class类型

protected <T> List<T> getDefaultStrategies(ApplicationContext context, Class<T> strategyInterface) {

    // 相应组件的类名

    String key = strategyInterface.getName();

    // 从property中获取当前策略接口实现类的类名集合

    String value = defaultStrategies.getProperty(key);

    if (value != null) {

        // 获取策略接口所有实现类的类名

        String[] classNames = StringUtils.commaDelimitedListToStringArray(value);

        List<T> strategies = new ArrayList<T>(classNames.length);

        for (String className : classNames) {

            try {

                // 创建相应实现类的bean,并放入集合中

                Class<?> clazz = ClassUtils.forName(className, DispatcherServlet.class.getClassLoader());

                Object strategy = createDefaultStrategy(context, clazz);

                strategies.add((T) strategy);

            }

            catch (ClassNotFoundException ex) {

                throw new BeanInitializationException(

                        "Could not find DispatcherServlet's default strategy class [" + className +



# 最后总结

搞定算法,面试字节再不怕,有需要文章中分享的这些**二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析**,以及**算法刷题LeetCode中文版的小伙伴们可以点赞后[点击这里即可免费获取!](https://gitee.com/vip204888/java-p7)**

最后再分享一份**终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化**

![image](https://img-blog.csdnimg.cn/img_convert/73c691eeb8b632cb7bc9b3bd81813b30.png)

            catch (ClassNotFoundException ex) {

                throw new BeanInitializationException(

                        "Could not find DispatcherServlet's default strategy class [" + className +



# 最后总结

搞定算法,面试字节再不怕,有需要文章中分享的这些**二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析**,以及**算法刷题LeetCode中文版的小伙伴们可以点赞后[点击这里即可免费获取!](https://gitee.com/vip204888/java-p7)**

最后再分享一份**终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化**

[外链图片转存中...(img-1jOkO1CE-1628603396039)]

最后

以上就是合适高山为你收集整理的【源码分析设计模式 11(1),Java开发框架的全部内容,希望文章能够帮你解决【源码分析设计模式 11(1),Java开发框架所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部