设计模式之十一:策略模式
来源:互联网 发布:淘宝gxg代购是正品吗 编辑:程序博客网 时间:2024/06/05 05:24
策略模式(Strategy Pattern)也称作政策模式(Policy Pattern)。
定义:Define a family of algorithms ,encapsulat each one ,and make them interchangeable.(定义一组算法,将每个算法封装起来,并且使他们之间可以互换。)
通用类图:
策略模式的三个角色:
Context封装角色: 起承上启下的封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
Strategy抽象策略角色:定义每个策略或算法必须具有的方法和属性
ConcreteStrategy具体策略角色:实现抽象策略中的操作,该类含有具体的算法。
优点:
1、算法可以自由切换;
2、避免了使用多重条件判断;
3、扩展性好;
缺点:
1 、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。2、 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。
实现:
/// <summary> /// 抽象的策略角色 /// </summary> public interface Strategy { //策略模式的运算法则 public void doSomething(); } /// <summary> /// 具体的策略角色1 /// </summary> public class ConcreteStrategy1 : Strategy { public void doSomething() { } } /// <summary> /// 具体的策略角色2 /// </summary> public class ConcreteStrategy2 : Strategy { public void doSomething() { } } public class Context { private Strategy strategy = null; public Context(Strategy _strategy) { strategy = _strategy; } /// <summary> /// 封装后的策略方法 /// </summary> public void doAnything() { strategy.doSomething(); } } public class Client { public static void main(String[] args) { //声明一个具体的策略 Strategy strategy = new ConcreteStrategy1(); //声明上下文对象 Context context = new Context(strategy); //执行封装后的方法 context.doAnything(); } }
好了,这一章就写到这,欢迎大家加入QQ群:280993838 。或者关注我的公众号:
0 0
- 设计模式之十一:策略模式
- 【设计模式】【十一】策略模式
- C++设计模式之二十一:Strategy(策略模式)
- 设计模式(十一)策略模式
- 设计模式(十一)策略模式
- 设计模式(十一)策略模式
- 策略模式(Strategy) - (模式之十一)
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- Spring中ClassPathXmlApplicationContext类的简单使用
- 一起学WEB(八) 一个网页练习(一)
- docker
- 1001_A+B for Matrices
- (u)int8_t/(u)int16_t/(u)int32_t/(u)int64_t/(u)intptr_t简介
- 设计模式之十一:策略模式
- c++ unsigned和int类型转换及运算
- 16 款最流行的 JavaScript 框架
- Swagger入门教程
- Java中如何使封装自己的类,建立并使用自己的类库?
- 关于配置华为VLAN划分及实现VLAN间的通信
- 微信小程序开发如何使用npm包--labrador使用
- 利用梅尔倒谱系数(MFCC)及空间聚类算法实现音色识别
- 如何在Linux中查看所有正在运行的进程