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

    什么是策略模式

    定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

    策略模式由三种角色组成

    策略模式应用场景

    策略模式的用意是针对一组算法或逻辑,将每一个算法或逻辑封装到具有共同接口的独立的类中,从而使得它们之间可以相互替换。策略模式使得算法或逻辑可以在不影响到客户端的情况下发生变化。说到策略模式就不得不提及OCP(Open Closed Principle) 开闭原则,即对扩展开放,对修改关闭。策略模式的出现很好地诠释了开闭原则,有效地减少了分支语句。

    比如电商网站根据会员收费:

    package CeLueModel;
    
    public class StrategyModel {
    
        public static void main(String[] args) {
            
        }
        //三种会员 铂金会员 黄金会员 普通会员
        public void getPrice(String level){
            Long price = null;
            if (level.equals("铂金会员") ) {
                price=(long)(100*100);
            }else if(level.equals("黄金会员")){
                price=(long)(100*150);
            }else {
                price=(long)(100*200);
            }
        }
        
    }

    这样的代码扩展性很低!!!需要修改Java的整体代码

    servlet底层去找不同的方法时候 也是用的策略模式    

    通过 策略模式去重构: 

    package CeLueModel;
    
    //策略模式定义抽象公共算法
    abstract class Strategy {
        
        abstract void algorithmInterface();
         
    }
    
    //初级会员
    class StrategyA extends Strategy{
        @Override
        void algorithmInterface() {
            System.out.println("初级会员");
        }
    }
    
    class StrategyB extends Strategy{
        @Override
        void algorithmInterface() {
            System.out.println("中级会员");
        }
    }
    
    class StrategyC extends Strategy{
        @Override
        void algorithmInterface() {
            System.out.println("高级会员");
        }
    }
    
    //维护算法的上下文
    class Context{
        private Strategy strategy;
        public Context(Strategy strategy) {
            this.strategy=strategy;
        }
        void algorithmInterface() {
            strategy.algorithmInterface(); //通过基类去调用算法
        }
    }
    
    public class StrategyTest {
    
        public static void main(String[] args) {
            Context context=null;
    
             Strategy strategyA  =  new StrategyA();
             //上下文
             context = new Context(strategyA); 
             context.algorithmInterface();
            
             Strategy strategyB  =  new StrategyB();
             //上下文
             context = new Context(strategyB); 
             context.algorithmInterface();
             
             Strategy strategyC  =  new StrategyC();
             //上下文
             context = new Context(strategyC); 
             context.algorithmInterface();
        }
        
    }

    运行结果:

     通过Context隐藏了算法的具体实现 

    通过一个入口管理起来     

    不用抽象类 用接口也行! 看具体场景了

    用抽象类 模板方法可以和抽象类一起使用!

    servlet: 模板方法 观察者模式 策略模式 

    策略模式项目应用:

      在项目中,多个if判断,不利于扩展维护。

      建议使用策略模式。通过Java反射机制去实现。

  • 相关阅读:
    JAVA获取昨天、今天、明天等日期
    IDEA设置调用方法时提示方法上的注释
    Hibernate使用distinct返回不重复的数据,使用group by 进行分组
    SpringBoot 自定义注解
    tailwindcss 使用总结
    nodejs nvm 包管理
    macos NPM 全局安装解决方案
    git 遇到修改github密码导致本地push失败解决方案
    Jupyter 快捷方式设置
    Vue indent eslint缩进webstorm冲突解决
  • 原文地址:https://www.cnblogs.com/toov5/p/9871335.html
Copyright © 2011-2022 走看看