设计模式之策略模式
时间:2022-07-22
本文章向大家介绍设计模式之策略模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
设计模式之策略模式
结构
说明
Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
定义一个算法的系列,将其各个分装,并且使他们有交互性。策略模式使得算法在用户使用的时候能独立的改变。
适用条件
- 算法有多个变体可供使用;
- 多个相似的类仅仅因为行为不同, 这时可以将这些类合并并采用行为模式处理这些行为;
- 一个类中的某个行为有过多的分支, 这时可以将这些行为封装成不同的算法;
- 希望隐藏算法中采用的数据;
实现
public interface IStrategy {
int Execute(int a, int b);
}
public class AddStrategy : IStrategy {
public int Execute(int a, int b) {
return a + b;
}
}
public class SubstractStrategy : IStrategy {
public int Execute(int a, int b) {
return a - b;
}
}
public class MultiplyStrategy : IStrategy {
public int Execute(int a, int b) {
return a * b;
}
}
public class Context {
private readonly IStrategy _strategy;
public Context(IStrategy strategy) {
this._strategy = strategy;
}
public int ExecuteStrategy(int a, int b) {
return this._strategy.Execute(a, b);
}
}
class Client {
static void Main(string[] args) {
Context context;
// Three contexts following different strategies
context = new Context(new AddStrategy());
var resultA = context.ExecuteStrategy(3, 4);
Console.WriteLine(resultA);
context = new Context(new SubstractStrategy());
var resultB = context.ExecuteStrategy(3, 4);
Console.WriteLine(resultB);
context = new Context(new MultiplyStrategy());
var resultC = context.ExecuteStrategy(3, 4);
Console.WriteLine(resultC);
Console.ReadKey();
}
}
策略模式与桥模式有着相同的类图, 但是两种模式的意图是不相同的, 桥模式表示的是结构, 而策略模式表示的是行为。
策略模式中的 Context 与 Strategy 的耦合性比桥模式中的 Abstraction 与 Implementation 更紧密。
- HDUOJ-----2399GPA
- HDUOJ----旋转的二进制
- HDUOJ---3743Frosh Week(BIT+离散化)
- Node.js新手必须知道的4个JavaScript概念
- HUDOJ-----1394Minimum Inversion Number
- 提升 Node.js 应用性能的 5 个技巧
- HDUOJ-----1166敌兵布阵
- HDUOJ------2492Ping pong
- HDUOJ----2489 Minimal Ratio Tree
- HDUOJ----2487Ugly Windows
- HDUOJ--------1003 Max Sum
- HDUOJ -----1864 最大报销额(动态规划)
- 行受影响 是什么意思
- c++课程设计(日历)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CentOS7下编译FFMPEG源代码
- Android 的 Presentation 双屏异显,遇到的问题总结
- 音视频相关开发库和资料
- Flink深入浅出: 应用部署与原理图解(v1.11)
- 用 Github Actions 在 K8S 中运行 CI 测试
- 线程池的拒绝策略
- 15 张图带你深入理解浮点数
- 用Python实现坦克大战游戏 | 干货贴
- hexo搭建个人网站博客完全教程
- 快速入门 Python 数据库操作
- Shell脚本管道符与重定向
- 偿还技术债(3)-ARouter源码详解
- 偿还技术债(4)-ARouter自己实现一个?
- 偿还技术债(5)-LeakCanary源码详解
- 数据库PostrageSQL-服务器配置(查询规划)