zoukankan      html  css  js  c++  java
  • 设计模式(二)_ 策略模式

    上篇学习了单例模式,接着学习,坚持就是胜利,今天主要学习下策略模式,参考了gitchat周君的相关课程,但是内容全部手打,拒绝粘贴。

    什么是策略模式

    策略模式的用意是针对一组算法,将每一个 算法封装到具有相同接口的独立类中,从而使得它们之间可以相互替换,此模式让算法的变化可以不影响客户端的情况下发生。

    一般情况下,我们是将一种行为写成一个类方法,比如计算器的加、减、乘、除。而策略模式是将每一种算法写成一个类,然后动态的选择用哪种算法。

    这里所说的算法并不是 “冒泡排序算法” 之类的算法。它可以是 一段代码,一个请求、一个业务操作。

    实现计算器代码举例

    第一次画uml 图。如有不对请指正

    enter image description here

    这个例子为加法和减法创建了一个类。具体代码如下

    Operation 接口:

    package com.zhb.service;
    
    public interface Operation {
    	
    	public int doOperation(int num1,int num2);
    
    }
    
    

    2个实现类,加法和减法

    public class OperationAdd implements Operation{
    
    	@Override
    	public int doOperation(int num1, int num2) {
    		
    		return num1 + num2;
    	}
    
    }
    
    
    public class OperationSub implements Operation{
    
    	@Override
    	public int doOperation(int num1, int num2) {
    		
    		return num1 - num2;
    	}
    
    }
    
    

    计算器类:

    package com.zhb.main;
    
    import com.zhb.service.Operation;
    
    public class Calculator {
    	
    	private Operation operation;
    
    
    
    	public void setOperation(Operation operation) {
    		this.operation = operation;
    	}
    	
    	public int doOperation(int num1, int num2){
    		return this.operation.doOperation(num1, num2);
    	}
    	
    
    }
    

    使用:

    	public static void main(String[] args) {
    		Calculator calculator = new Calculator();
    		OperationAdd add = new OperationAdd();
    		OperationSub sub = new OperationSub();
    		
    		calculator.setOperation(add);
    		int result = calculator.doOperation(1, 2);
    		System.out.println(result);
    		
    		calculator.setOperation(sub);
    		int result1 = calculator.doOperation(1, 1);
    		System.out.println(result1);
    		
    	}
    

    看到这里,大家一定和我一样疑惑,感觉这没必要建新的类,直接一个类2个add(),sub() 方法就可以搞定啊。你如果在写乘法,还要再写一个类。多麻烦。

    的确,使用策略模式使代码增多,如果下面这种场景下

    如果将你写好的计算器代码打包发布出去,供大家使用。如果大家后来发现,我不仅要加减乘除、还要开方。此时怎么办?

    如果你用普通写法的计算器,你可能需要在类中 再增加开方的方法就好了。 但是你 提供的jar包。就算你提供源码,你希望别人修改你的源码不?一般提供出去的框架或库,都是经过千锤百炼的。经过无数次测试的,如果别人修改源码很容易产生不可预知的错误。再其次。实际工作中,你写的代码好还行,不好的话,说实话,看都不想看,别说改了。

    如果你使用策略模式,你只需要定义一个开方的类实现Operation 接口。然后调用 calculator.setOperation(new 开方类()); 即可。

    这里很好的体现了一个设计模式的基本原则:开闭原则。
    开闭原则说的是 对修改关闭、对扩展开放。

    优点

    • 遵守开闭原则,扩展性良好

    缺点

    • 随着你的策略增加,你的类也会越来越多
    • 所有 的策略类都要暴露出去,所以如果在实际开发中你使用了策略模式,你一定要让你同事知道已有哪些策略。

    例子代码后期会放到github上,每种设计模式的代码都会上传上去,敬请期待。

    代码下载 github

  • 相关阅读:
    yum 安装包的用法
    php session文件修改路径
    apache性能测试工具ab使用详解
    shell exit 0 exit 1
    网站架构(页面静态化,图片服务器分离,负载均衡)方案全解析
    【转载】新手如何快速打造高流量网站
    高并发处理方案
    HTML静态化技术
    在项目中学习.NET的json(二)之运费计算器
    在项目中学习.NET的json(一)
  • 原文地址:https://www.cnblogs.com/zhenghengbin/p/9212982.html
Copyright © 2011-2022 走看看