策略模式 Strategy
 
与策略相关的常见词汇有:营销策略、折扣策略、教学策略、记忆策略、学习策略....
“策略”意味着分情况讨论,而不是一概而论
面对不同年龄段的人,面对不同的商品,必然将会有不同的话术;
面对购物总价的范围,很可能会有不同的折扣方案;
面对理解能力不同的学生,必然有不同的教学策略;
 
而在我们程序的世界里,“策略”就是分情况讨论。也就是类似状态模式中的条件分支或者选择分支
只不过状态模式中是事物的不同状态,而策略模式中关注的是处理方法
比如
if(totalPrice > 1000){
//9折
else if(totalPrice > 2000){
//8折
}else if(totalPrice > 3000){
//7折
}
这就是一种打折策略,对应于购物总金额的不同,采用不同的处理方法。
显然,使用条件分支或者选择语句,类似状态模式中的分析,也存在类似的问题
如果条件过多,会导致处理逻辑复杂
而且,策略的逻辑与业务逻辑耦合在一起,如果处理方法变化还需要修改业务逻辑方法,扩展性差
而且,也不适合增加新的策略方案

意图

定义一系列的算法,把他们一个个的封装起来,并使他们可以互相转换,本模式使得算法可以独立于使用它的客户端而变化。
别名:政策Policy
策略模式与状态模式本质一样,只不过一个是状态,一个是行为算法。

结构

抽象策略角色Strategy
定义了抽象的策略,比如打折,排序等
定义了策略的一致性访问接口,比如定义了一个排序接口 sort()
具体策略角色ConcreteStrategy
实现抽象策略的定义的接口,实现自己的行为算法,比如ConcreteStrategyA冒泡 ConcreteStrategyB快排
环境类Context
维护Strategy,持有一个Strategy的引用,用来管理Strategy,可以切换策略
是Strategy的使用者

代码示例

排序接口,定义了一个sort方法
package strategy;
public interface SortStrategy {
void sort();
}
package strategy;
public class Bubble implements SortStrategy {
@Override
public void sort() {
System.out.println("冒泡排序,输出结果...");
}
}
package strategy;
public class QuickSort implements SortStrategy {
@Override
public void sort() {
System.out.println("快速排序,输出结果...");
}
}
环境类
内部持有一个SortStrategy,简单起见初始化为Bubble
使用一个简单的方法进行切换
并且提供sort方法,代理strategy的sort方法
package strategy;
public class Context {
private SortStrategy strategy = new Bubble();
public void setStrategy(String strategy) {
if(strategy.equals("bubble")){
this.strategy = new Bubble();
}else if(strategy.equals("quick")){
this.strategy = new QuickSort();
}
}
public void sort() {
strategy.sort();
}
}
测试方法
package strategy;
public class Test {
public static void main(String[] args) {
Context context = new Context();
context.sort();
context.setStrategy("quick");
context.sort();
context.setStrategy("bubble");
context.sort();
}
}
上面的代码可以看得出来,具体的算法行为,被封装在了具体的策略类中,比如Bubble和QuickSort
通过环境类Context对算法进行管理切换。

总结

策略模式与状态模式是类似的,借助于多态的特性,以达到不同状态不同行为
不同的场景使用不同的算法,这本就是一种“不同状态,不同行为”的含义延伸
都是借助于多态特性,进而也就是依赖倒置原则---面向抽象编程,其根本也是为了“低耦合”。
 
策略模式中使用独立的类来封装不同的算法行为,每一个类封装具体的行为
策略模式主要是将算法的定义与使用进行分开,算法被封装在不同的策略类中
借助于算法的环境类Context,针对抽象策略进行编程,符合依赖倒置原则 
而且,新增加具体的算法,只需要增加一个新的具体的策略类即可。
 
策略模式将算法的定义与使用分开,具体的策略完全可以通过配置文件等方式注入到Context中,客户端完全不需要关注具体的策略
而且,运行时可以随时的更换策略
 
策略模式的Context,我们的示例中一个Context一个当前策略,那么Context到底内部维护几个策略?到底谁负责切换,是客户端还是Context
个人认为都是灵活的,策略模式的核心就在于算法的定义与使用的解耦,在接下来的其他事情,自己看情况随便来(随便的前提是合理有效)
 
只要是涉及到多种算法行为
切换:策略可以运行时切换
复用:算法与使用解耦,算法可以单独扩展
封装:屏蔽使用者对算法内部数据结构等逻辑的了解,否则如果算法的实现耦合在客户端,客户端不是一清二楚么
可以考虑策略模式,策略模式能够灵活的切换算法,以及算法独立发展,符合开闭原则 
 
但是类似状态模式,策略模式也会产生很多小的具体的策略类,增加类的个数和运行时对象的个数。

策略模式 Strategy 政策Policy 行为型 设计模式(二十五)的更多相关文章

  1. 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...

  2. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  3. 设计模式---策略模式Strategy(对象行为型)

    1. 概述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不 ...

  4. 设计模式-策略模式---Strategy(对象行为型)

    策略模式 1.概念 分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户. 2.代码实现:(模拟鸭子应用)https://git.oschina.net/ipnunu/Desi ...

  5. 策略模式Strategy(对象行为型)

    原文地址:http://blog.csdn.net/hguisu/article/details/75582491.策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得 ...

  6. [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)

    [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...

  7. JAVA设计模式之策略模式 - Strategy

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

  8. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...

  9. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

随机推荐

  1. 基于Token认证的多点登录和WebApi保护

    在文章中有错误的地方,或是有建议或意见的地方,请大家多多指正,邮箱: linjie.rd@gmail.com 一天张三,李四,王五,赵六去动物园,张三没买票,李四制作了个假票,王五买了票,赵六要直接F ...

  2. BoltDB简单使用教程

    1.BoltDB简介 Bolt是一个纯粹Key/Value模型的程序.该项目的目标是为不需要完整数据库服务器(如Postgres或MySQL)的项目提供一个简单,快速,可靠的数据库. BoltDB只需 ...

  3. Java并发编程面试题 Top 50 整理版

    本文在 Java线程面试题 Top 50的基础上,对部分答案进行进行了整理和补充,问题答案主要来自<Java编程思想(第四版)>,<Java并发编程实战>和一些优秀的博客,当然 ...

  4. 第13章 Base64 URL编码 - IdentityModel 中文文档(v1.0.0)

    JWT令牌使用Base64 URL编码进行序列化. IdentityModel包括Base64Url帮助编码/解码的类: var text = "hello"; var b64ur ...

  5. PHP 单例模式优点意义及如何实现

    一.什么是单例模式? 1.含义 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例.它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用. 2. ...

  6. 设计模式之迭代器模式——Java语言描述

    迭代器模式是Java和.NET编程环境中非常常用的设计模式.这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示 介绍 意图 提供一种方法顺序访问一个聚合对象中各个元素,无需暴露该对象的内 ...

  7. EasyToLearnDesignPattern

    简单上手设计模式 GITHUB:https://github.com/Fisher-Joe/EasyToLearnDesignPattern 本文旨在使用最简单的语言,最简单的代码让人学习设计模式(最 ...

  8. 【原】Java学习笔记034 - 网络

    package cn.temptation; import java.net.InetAddress; public class Sample01 { public static void main( ...

  9. kodi18.1设置中文的方法

    默认情况下,新安装好的 Kodi 启动后是英文版的界面.但事实上,Kodi 包含多国语言 (包含简繁体中文版),我们可以设置改回简体中文界面.不过,很多人都遇到修改 Kodi 的语言为中文之后整个界面 ...

  10. VMware端口映射配置步骤

    1:编辑->虚拟网络编辑器 2:点击NAT模式-->NAT设置 3:注意:主机端口就是物理机的端口,虚拟机就是wmware中的系统 点击添加