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反射机制去实现。

  • 相关阅读:
    Attach Files to Objects 将文件附加到对象
    Provide Several View Variants for End-Users 为最终用户提供多个视图变体
    Audit Object Changes 审核对象更改
    Toggle the WinForms Ribbon Interface 切换 WinForms 功能区界面
    Change Style of Navigation Items 更改导航项的样式
    Apply Grouping to List View Data 将分组应用于列表视图数据
    Choose the WinForms UI Type 选择 WinForms UI 类型
    Filter List Views 筛选器列表视图
    Make a List View Editable 使列表视图可编辑
    Add a Preview to a List View将预览添加到列表视图
  • 原文地址:https://www.cnblogs.com/toov5/p/9871335.html
Copyright © 2011-2022 走看看