策略模式不了解一下?

发布时间:2022-07-01 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了策略模式不了解一下?脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

Java策略模式

1.策略模式简介

策略模式:策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口具体行为的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。每个if判断都可以理解为就是一个策略。本模式使得算法可独立于使用它的用户而变化

2.模式结构

策略模式包含如下角色:

  • Strategy: 抽象策略类:策略是一个接口,该接口定义若干个算法标识,即定义了若干个抽象方法(如下图的algorIThm())

  • Context: 环境类 /上下文类:

    • 上下文是依赖于接口的类(是面向策略设计的类,如下图Context类),即上下文包含用策略(接口)声明的变量(如下图的strategy成员变量)。
    • 上下文提供一个方法(如下图Context类中的的lookAlgorithm()方法),该方法委托策略变量调用具体策略所实现的策略接口中的方法(实现接口的类重写策略(接口)中的方法,来完成具体功能)
    • @H_126_39@
    • concreteStrategy: 具体策略类:具体策略是实现策略接口的类(如下图的ConcretestrategyA类和ConcreteStrategyB类)。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体方法。(说白了就是重写策略类的方法!)

    策略模式不了解一下?

    3.案例

    策略模式不了解一下?

    1).传统实现方式

    代码

        public Double calculationPRice(String tyPE, Double originalPrice, int n) {
    
            //中级会员计费
            if (type.equals("intermediateMember")) {
                return originalPrice * n - originalPrice * 0.1;
            }
            //高级会员计费
            if (type.equals("advancePrimaryMember")) {
                return originalPrice * n - originalPrice * 0.2;
            }
            //普通会员计费
            return originalPrice;
        }
    

    传统的实现方式,通过传统if代码判断。这样就会导致后期的维护性非常差。当后期需要新增计费方式,还需要在这里再加上if(),也不符合设计模式的开闭原则。

    2).策略模式实现

    抽象类策略

    package StrategyExercise;
    
    public interface MemberStrategy {
        // 一个计算价格的抽象方法
        //price商品的价格 n商品的个数
        public double calcPrice(double price, int n);
    }
    
    

    具体实现类

    // 普通会员——不打折
    public class PrimaryMemberStrategy implements MemberStrategy { // 实现策略
        //重写策略方法具体实现功能
        @override
        public double calcPrice(double price, int n) {
            return price * n;
        }
    }
    
    package StrategyExercise;
    
    // 中级会员 打百分之10的折扣
    public class IntermediateMemberStrategy implements MemberStrategy{
        @Override
        public double calcPrice(double price, int n) {
            double money = (price * n) - price * n * 0.1;
            return money;
        }
    }
    
    
    package StrategyExercise;
    
    // 高级会员类 20%折扣
    public class AdvanceMemberStrategy implements MemberStrategy{
        @Override
        public double calcPrice(double price, int n) {
            double money = price * n - price * n * 0.2;
            return money;
        }
    }
    
    

    上下文类

    也叫做上下文类或环境类,起承上启下封装作用。

    package StrategyExercise;
    
    /**
     * 负责和具体的策略类交互
     * 这样的话,具体的算法和直接的客户端调用分离了,使得算法可以独立于客户端独立的变化。
     */
    
    // 上下文类/环境类
    public class MemberContext {
        // 用户折扣策略接口
        private MemberStrategy memberStrategy;
    
        // 注入构造方法
        public MemberContext(MemberStrategy memberStrategy) {
            this.memberStrategy = memberStrategy;
        }
    
        // 计算价格
        public double qoutePrice(double goodsPrice, int n){
            // 通过接口变量调用对应的具体策略
            return memberStrategy.calcPrice(goodsPrice, n);
        }
    
    }
    
    

    测试类

    package StrategyExercise;
    
    // 测试类
    public class Application {
        public static void main(String[] args) {
    
            // 具体行为策略
            MemberStrategy primaryMemberStrategy = new PrimaryMemberStrategy(); // 接口回调(向上转型)
            MemberStrategy intermediateMemberStrategy = new IntermediateMemberStrategy();
            MemberStrategy advanceMemberStrategy = new AdvanceMemberStrategy();
    
            // 用户选择不同策略
            MemberContext primaryContext = new MemberContext(primaryMemberStrategy);
            MemberContext intermediateContext = new MemberContext(intermediateMemberStrategy);
            MemberContext advanceContext = new MemberContext(advanceMemberStrategy);
    
            //计算一本300块钱的书
            System.out.println("普通会员的价格:"+ primaryContext.qoutePrice(300,1));// 普通会员:300
            System.out.println("中级会员的价格:"+ intermediateContext.qoutePrice(300,1));// 中级会员 270
            System.out.println("高级会员的价格:"+ advanceContext.qoutePrice(300,1));// 高级会员240
        }
    }
    
    

    运行结果

    普通会员的价格:300.0 中级会员的价格:270.0 高级会员的价格:240.0

    上述案例UML类图

    策略模式不了解一下?

    4.策略模式优缺点

    1)优点

    • 策略模式提供了对“开闭原则”的完美支持,用户可以在不 修改原有系统的基础上选择算法或行为,也可以灵活地增加 新的算法或行为。

    • 策略模式提供了管理相关的算法族的办法。

    • 策略模式提供了可以替换继承关系的办法。

    • 使用策略模式可以避免使用多重条件转移语句。

    2)缺点

    • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
    • 策略模式将造成产生很多策略类,可以通过使用享元模式在一 定程度上减少对象的数量。

    5.策略模式适用场景

    在以下情况下可以使用策略模式:

    • 如果在一个系统里面有许多类,它们之间的区别仅在于它们 的行为,那么使用策略模式可以动态地让一个对象在许多行 为中选择一种行为。
    • 一个系统需要动态地在几种算法中选择一种。
    • 如果一个对象有很多的行为,如果不用恰当的模式,这些行 为就只好使用多重的条件选择语句来实现。
    • 不希望客户端知道复杂的、与算法相关的数据结构,在具体 策略类中封装算法和相关的数据结构,提高算法的保密性与 安全性。

    在我们生活中比较常见的应用模式有:

    1、电商网站支付方式,一般分为银联、微信、支付宝,可以采用策略模式 2、电商网站活动方式,一般分为满减送、限时折扣、包邮活动,拼团等可以采用策略模式

    策略模式不了解一下?

    6.总结

    • 在策略模式中定义了一系列算法,将每一个算法封装起来,并让它们 可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为 政策模式。策略模式是一种对象行为型模式。

    • 策略模式包含三个角色:环境类在解决某个问题时可以采用多种策略, 在环境类中维护一个对抽象策略类的引用实例;抽象策略类为所支持 的算法声明了抽象方法,是所有策略类的父类;具体策略类实现了在 抽象策略类中定义的算法。

    • 策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派 给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的 策略类里面,作为一个抽象策略类的子类。

    • 策略模式主要优点在于对“开闭原则”的完美支持,在不修改原有系 统的基础上可以更换算或者增加新的算法,它很好地管理算法族, 提高了代码的复用性,是一种替换继承,避免多重条件转移语句的 实现方式;其缺点在于客户端必须知道所有的策略类,并理解其区 别,同时在一定程度上增加了系统中类的个数,可能会存在很多策 略类

    • 策略模式适用情况包括:在一个系统里面有许多类,它们之间的区 别仅在于它们的行为,使用策略模式可以动态地让一个对象在许多 行为中选择一种行为;一个系统需要动态地在几种算法中选择一种; 避免使用难以维护的多重条件选择语句;希望在具体策略类中封装 算法和与相关的数据结构。

    注:如果文章有任何错误或不足,请各位大佬尽情指出,评论留言留下您宝贵的建议!如果这篇文章对你有些许帮助,希望可爱亲切的您点个赞推荐一手,非常感谢啦

    策略模式不了解一下?

    脚本宝典总结

    以上是脚本宝典为你收集整理的策略模式不了解一下?全部内容,希望文章能够帮你解决策略模式不了解一下?所遇到的问题。

    如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

    本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
    如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。