设计模式:策略模式(Strategy)
来源:互联网 发布:worktile for mac 编辑:程序博客网 时间:2024/06/06 12:41
转自:http://blog.csdn.net/jungle_hello
定义
策略模式(Strategy)属于对象行为型设计模式,主要是定义一系列的算法,把这些算法一个个封装成拥有共同接口的单独的类,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。这里的算法不要狭义的理解为数据结构中算法,可以理解为不同的业务处理方法。
这种做法会带来什么样的好处呢?
它将算法的使用和算法本身分离,即将变化的具体算法封装了起来,降低了代码的耦合度,系统业务策略的更变仅需少量修改。
算法被提取出来,这样可以使算法得到重用,这种情况还可以考虑使用享元模式来共享算法对象,来减少系统开销(但要注意使用享元模式的建议条件)。
结构
先由定义来想象下它的结构吧:要使算法拥有共同的接口,这样就要实现一个接口或者
一个抽象类出来才行。这样基本上轮廓也就出来了,我们来看看吧:
策略模式由三个角色组成:
1) 算法使用环境角色(Context):算法被引用到这里和一些其它的与环境有关的操作一起来完成任务。
2) 抽象策略角色(Strategy):规定了所有具体策略角色所需的接口。在java 它通常由接口或者抽象类来实现。
3) 具体策略角色(Concrete Strategy):实现了抽象策略角色定义的接口。
策略模式各个角色之间关系的类图表示:
策略模式的实现
//抽象策略--Strategy- public interface Calculate { //一个待实现方法 int calculate(int a,int b);}//具体策略角色--Concrete Strategy1public class AddCalculate implements Calculate { @Override //接口方法具体实现之加法 public int calculate(int a, int b) { return a+b; }}//具体策略角色--Concrete Strategy2 public class DivideCalculate implements Calculate{ @Override //接口方法具体实现之除法 public int calculate(int a, int b) { return a/b; }}//算法使用环境角色--Context public class EnvironmentRole { private Calculate cal; //构造方法对变量完成赋值 public EnvironmentRole(Calculate cal) { this.cal = cal; } //获得策略类对象 public Calculate getCalculate() { return cal; } //用set方法注入策略对象 public void setCalculate(Calculate cal) { this.cal = cal; } //环境角色中的接口方法,其具体结果依赖于策略引用指向的具体策略角色对象 public int calculate(int a,int b) { return cal.calculate(a, b); }}//一个客户端演示 public class Client { public static void main(String[] args) { Calculate add = new AddCalculate(); EnvironmentRole environmentRole = new EnvironmentRole(add); System.out.println(environmentRole.calculate(3, 4)); Calculate divide = new DivideCalculate(); EnvironmentRole environment = new EnvironmentRole(divide); System.out.println(environment.calculate(9, 3)); }}
0 0
- 设计模式----Strategy(策略)
- 设计模式--Strategy(策略)
- Strategy(策略)设计模式
- 设计模式----策略模式(Strategy)
- 设计模式--策略模式(Strategy)
- 设计模式C++(Strategy策略模式)
- 设计模式---策略模式(strategy)
- java 设计模式--策略模式(strategy)
- 【设计模式】之策略模式(Strategy)
- 设计模式之--策略模式(Strategy)
- 设计模式C++(Strategy策略模式)
- 设计模式(一)Strategy - 策略模式
- 设计模式之策略(strategy)模式
- 设计模式之策略模式(Strategy)
- 设计模式5--策略模式(Strategy)
- 设计模式-----策略模式(strategy)
- 浅学设计模式--策略(Strategy)模式
- PHP 设计模式 策略模式(Strategy)
- [Mysql]Host “”is not allowed to connect to this MySQL server——如何设置远程
- Android自定义View 之 SwitchButtonView
- springMVC请求访问静态资源报错javax.servlet.http.HttpServletRequest.getHeader(Ljava/lang/String;)
- hdoj 2041/2042/2043/2044/2046 (递归——斐波那契数列)
- 句柄
- 设计模式:策略模式(Strategy)
- php编码解码json对象
- Android 图片压缩展示 防止使用MediaStore.Images.Media.getBitmap造成的OOM异常
- 常见的几种RuntimeException
- Java 8 新特性:Lambda 表达式之方法引用(Lambda 表达式补充版)——诺诺"涂鸦"记忆
- monodb因 /usr/lib64/libssl.so.10: no version information available原因不能连接的问题
- org.apache.commons.net.io.CopyStreamException: IOException caught while copying
- 网络:监听网络(使用Reachability框架)
- 88.NSUserDefaults数据存储总结