zoukankan      html  css  js  c++  java
  • 策略模式

    策略模式(Strategy Pattern),将各种算法封装到具体的类中,作为一个抽象策略类的子类,使得它们可以互换。客户端可以自行决定使用哪种算法。(许多相关的类行为不同(算法不同)可以使用策略)

    常规代码:

        /*常规调用*/
        public static int getTotal(String type, int num) {
            int total = 0;
            switch (type) {
                case "a":
                    if (num < 6)
                        total = 2;
                    else
                        total = 1;
                    break;
                case "b":
                    if(num<4)
                        total = 1;
                    else
                        total=1+(num-1)*4;
                    break;
                case "c":
                    total = total-1;
                    break;
                default:
                    break;
            }
            return total;
        }

    策略改版代码:

    public interface CalculateStrategy {
        /*策略模式的运算法则*/
        int calculate(int num);
    }
    public class NumberOne implements CalculateStrategy{
        /*具体策略1*/
        @Override
        public int calculate(int num) {
            return num<6?2:1;
        }
    }
    public class NumberTwo implements CalculateStrategy{
        /*具体策略2*/
        @Override
        public int calculate(int num) {
            return num<4?1:(1+(num-1)*4);
        }
    }
    public class NumberThree implements CalculateStrategy{
        /*具体策略3*/
        @Override
        public int calculate(int num) {
            return num-1;
        }
    }
    public class Context {
        /*抽象策略*/
        private CalculateStrategy strategy;
        private int num;
        /**
         * 构造函数设置具体策略
         * @param strategy
         * @param num
         */
        public Context(CalculateStrategy strategy,int num) {
            this.strategy = strategy;
            this.num = num;
        }
        /**
         * 封装后的策略方法
         * @return
         */
        public int calculate() {
            return this.strategy.calculate(num);
        }
    }
    public static void main(String[] args) {
            //策略者模式改版调用
            Context context;
            context=new Context(new NumberOne(),4);
            System.out.println(context.calculate());//2
    
            context=new Context(new NumberTwo(),5);
            System.out.println(context.calculate());//17
    
            context=new Context(new NumberThree(),5);
            System.out.println(context.calculate());//4
    }

    策略模式角色划分: Strategy 策略接口或者(抽象策略类),定义策略执行接口具体策略类 Context 上下文类,持有具体策略类的实例,并负责调用相关的算法。

    策略模式优点

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

    • 策略模式通过Context类提供了管理具体策略类(算法族)的办法。

    • 结合简单工厂模式和Annotation,策略模式可以方便的在不修改客户端代码的前提下切换算法(策略)。

    策略模式缺点

    • 传统的策略模式实现方式中,客户端必须知道所有的具体策略类,并须自行显示决定使用哪一个策略类。

    • 策略模式可能创建很多具体策略类的实例。

  • 相关阅读:
    Spring中的@Transactional(rollbackFor = Exception.class)属性详解
    查询数据库中表数量和各表中数据量
    69道Spring面试题和答案
    Spring常见面试题总结(超详细回答)
    nginx 解决session一致性
    redis 主从同步
    如何实现一个线程安全的单例,前提是不能加锁
    InnoDB中一棵B+树能存多少行数据
    ConcurrentHashMap 源码分析
    java HashMap 源码解析
  • 原文地址:https://www.cnblogs.com/LJing21/p/14837904.html
Copyright © 2011-2022 走看看