• 设计模式 -- 策略模式


    2015年12月10日21:54:25

    完成一个功能可能会有好几种算法或者方法来实现,通过对算法和方法的抽象,提供统一接口,不通算法,实现方式为实现类,通过注入不同的实现对象来实现算法,实现方式的灵活切换即为策略模式。

    策略模式是针对多种选择的代码片段的优化,是的代码减少修改,符合开闭原则。

    1. 编码实现就是先将各个算法或者实现方式抽象成一个接口,接口里面是所有实现方式的抽象方法。
    2. 每增加一种实现方式或者算法实现,就增加一个类实现该接口,并实现里面的抽象方法。
    3. 最后通过传入不同类的对象来实现不同算法或者实现方式的灵活切换。

    优点:逻辑直观,易于扩展。

    缺点:每增加一个算法或者实现方式都要实现一个类。类文件会显著增加

    感觉设计模式其实就讲的是一种技巧或者写好的代码的捷径。单同时也是牺牲了一部分的,比如类的数量变大了,单却更好的,更优雅的实现比较好的代码。

    策略在重构代码中的考量,比如类似 if lese , switch case 这类语句,如果判断很多,其实可以通过策略模式来重构这部分的代码,不至于一大坨,又一大坨的代码块。通过多个实现类的方式,灵活在多种算法,实现方式之间切换。

     下面是个减加乘的例子:

    首先抽象计算的接口:

    /**
     *抽象接口,高度抽象各个算法和实现方式的实现
     */
    public interface Strategy {
        public abstract String calculate(float a,float b);
    }

    然后分别是实现类:

    相加:

    public class AddStrategy implements Strategy {
        
        @Override
        public String calculate(float a, float b) {
            return "相加的结果"+(a+b);
        }
    }

    相减:

    1 public class SubStrategy implements Strategy {
    2 
    3 @Override
    4 public String calculate(float a, float b) {
    5 return "相减运算:"+(a-b);
    6 }
    7 }

    相乘:

    public class MultiplyStrategy implements Strategy {
    
        @Override
        public String calculate(float a, float b) {
            return "成法运算:"+(a*b);
        }
        
    }

    工厂类:

    public class ContextRole {
        //拥有一个策略类的引用   
        private Strategy strategy;    
        public ContextRole(String  type){
            
            if (type.equals("+")) {
                strategy = new AddStrategy();
            }else if (type.equals("-")) {
                strategy = new SubStrategy();
            }else if (type.equals("*")) {
                strategy = new MultiplyStrategy();
            }
        }
        public  String calculate(float a,float b) {    
            return strategy.calculate(a, b);
        }
    }

    测试类:

    public class Test {
        
        /** 
         * @Title: main 
         * @Description: TODO(这里用一句话描述这个方法的作用) 
         * @param @param args    设定文件 
         * @return void    返回类型 
         * @throws 
         */
        public static void main(String[] args) {
           ContextRole contextRole = new ContextRole("+");
           System.out.println(contextRole.calculate(1, 2));
           
           ContextRole contextRole1 = new ContextRole("-");
           System.out.println(contextRole1.calculate(1, 2));
           
           ContextRole contextRole2 = new ContextRole("*");
           System.out.println(contextRole2.calculate(1, 2));
            
        }
        
    }

    运行结果:

    相加的结果3.0
    相减运算:-1.0
    成法运算:2.0
  • 相关阅读:
    Windows中更改Docker默认安装路径方法
    利用nvm 安装多版本nodejs
    vue安装成功,vue V查看版本失败
    linux 删除并不记录,操作历史命令
    nw.js是什么
    如何开启Win10虚拟机HyperV功能
    win10 安装docker
    js生成随机颜色
    Flink出租车车程事件流和付车费事件流connect
    Flink基于 DataStream API 实现欺诈检测
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/5037590.html
Copyright © 2020-2023  润新知