zoukankan      html  css  js  c++  java
  • 设计模式【8】------>策略模式

    一、什么是策略模式

    • 定义了一系列的算法 或 逻辑 或 相同意义的操作,并将每一个算法、逻辑、操作封装起来,而且使它们还可以相互替换。(其实策略模式Java中用的非常非常广泛)
    • 我觉得主要是为了 简化 if…else ,switch...case等所带来的复杂和难以维护。

    二、策略模式结构

    1. 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
    2. 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
    3. 环境(Context)类:持有一个策略类的引用,最终给客户端调用。

    结构图

    三、策略模式应用场景

    • 策略模式的用意是针对一组算法或逻辑,将每一个算法或逻辑封装到具有共同接口的独立的类中,从而使得它们之间可以相互替换。
    1. 例如:我要做一个不同会员打折力度不同的三种策略,初级会员,中级会员,高级会员(三种不同的计算)。
    2. 例如:我要一个支付模块,我要有微信支付、支付宝支付、银联支付等

    四、代码演示

    • 模拟支付模块有微信支付、支付宝支付、银联支付

    1、定义抽象的公共方法

    /**
     * 策略模式 定义抽象方法 所有支持公共接口
     */
    abstract class BasePayStrategy {
    
        /**
         * 支付逻辑方法
         */
        abstract void algorithmInterface();
    
    }

    2、定义实现微信支付

    public class PayStrategyA extends BasePayStrategy {
        @Override
        void algorithmInterface() {
            System.out.println("微信支付...");
        }
    }

    3、定义实现支付宝支付

    public class PayStrategyB extends BasePayStrategy {
        @Override
        void algorithmInterface() {
            System.out.println("支付宝支付...");
        }
    }

    4、定义实现银联支付

    public class PayStrategyC extends BasePayStrategy {
        @Override
        void algorithmInterface() {
            System.out.println("银联支付...");
        }
    }

    5、定义上下文维护算法策略

    /**
     * 使用上下文维护算法策略
     */
    public class Context {
    
        private BasePayStrategy basePayStrategy;
    
        public Context(BasePayStrategy basePayStrategy){
            this.basePayStrategy=basePayStrategy;
        }
    
        public void algorithmInterface() {
            basePayStrategy.algorithmInterface();
        }
    }

    6、客户端测试

    /**
     * 策略模式运行测试
     */
    public class Client {
        public static void main(String[] args){
            Context context;
            //使用支付逻辑A
            context = new Context(new PayStrategyA());
            context.algorithmInterface();
            //使用支付逻辑B
            context = new Context(new PayStrategyB());
            context.algorithmInterface();
            //使用支付逻辑C
            context = new Context(new PayStrategyC());
            context.algorithmInterface();
        }
    }

    打印结果

    五、策略模式优缺点

    优点:

    1. 算法可以自由切换。
    2. 避免使用多重条件判断。
    3. 扩展性非常良好。

    缺点:

    1. 策略类会增多。
    2. 所有策略类都需要对外暴露。
    作者:donleo123
    本文如对您有帮助,还请多推荐下此文,如有错误欢迎指正,相互学习,共同进步。
  • 相关阅读:
    自然语言交流系统 phxnet团队 创新实训 项目博客 (十一)
    install ubuntu on Android mobile phone
    Mac OS, Mac OSX 与Darwin
    About darwin OS
    自然语言交流系统 phxnet团队 创新实训 项目博客 (十)
    Linux下编译安装qemu和libvirt
    libvirt(virsh命令总结)
    深入浅出 kvm qemu libvirt
    自然语言交流系统 phxnet团队 创新实训 项目博客 (九)
    自然语言交流系统 phxnet团队 创新实训 项目博客 (八)
  • 原文地址:https://www.cnblogs.com/donleo123/p/14564336.html
Copyright © 2011-2022 走看看