惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Privacy & Cybersecurity Law Blog
人人都是产品经理
人人都是产品经理
The Cloudflare Blog
B
Blog RSS Feed
罗磊的独立博客
V
V2EX
V
Visual Studio Blog
博客园 - 叶小钗
W
WeLiveSecurity
小众软件
小众软件
K
Kaspersky official blog
美团技术团队
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
Martin Fowler
Martin Fowler
Recorded Future
Recorded Future
Project Zero
Project Zero
Hugging Face - Blog
Hugging Face - Blog
Engineering at Meta
Engineering at Meta
Security Latest
Security Latest
Microsoft Azure Blog
Microsoft Azure Blog
V
Vulnerabilities – Threatpost
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
Help Net Security
Help Net Security
博客园 - Franky
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
F
Fortinet All Blogs
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Forbes - Security
Forbes - Security
M
MIT News - Artificial intelligence
H
Hacker News: Front Page
大猫的无限游戏
大猫的无限游戏
Vercel News
Vercel News
Spread Privacy
Spread Privacy
The Register - Security
The Register - Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
Google Online Security Blog
Google Online Security Blog
PCI Perspectives
PCI Perspectives
The Last Watchdog
The Last Watchdog
AI
AI
N
News | PayPal Newsroom
D
DataBreaches.Net
Cloudbric
Cloudbric
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 司徒正美
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog

博客园 - cjfwu

设计模式学习4-Bridge模式 设计模式学习2-Adapter模式 设计模式学习1-Facade模式 设备控制(反馈处理) 通过System.IO.Packaging实现打包和解包 将目录添加环境变量 设备控制之矩阵状态显示 windows shell 编程3(函数解释) windows shell 编程2(浏览文件夹) windows shell 编程1(概念) 不同命名空间下名称和结构相同的类相互序列化与反序列化 通过SvcUtil.exe生成客户端代码和配置 分组 在“添加引用”对话框中显示需要的Assembly 只运行一个实例 SVN操作 托盘操作 获得树节点的高度 枚举的操作
设计模式学习3-Strategy模式
cjfwu · 2013-03-31 · via 博客园 - cjfwu

场景描述:

一觉醒来看下时间还有30分钟才上班呢,笃笃定定穿好衣服,先抽根烟,然后去刷牙洗脸,慢悠悠上班去了;如果一觉醒来还有15分钟就迟到了,算了不抽烟了,穿好衣服,刷牙洗脸,急匆匆上班去了;如果一觉醒来只有5分钟了,肿么办!先花5秒钟平复一下心情,赶紧穿好衣服冲出去了!

可以发现,对于不同的起床时间做了不同的事情,如果用程序实现,有什么合适的模式吗?嗯,Strategy模式

Strategy模式(策略模式):

定义:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。将对算法的选择和算法的实现相分离。

实现:让使用算法的类(Context)包含一个抽象类(Strategy),该抽象类有一个抽象方法指定如何调用算法。每个派生类按需要实现算法。

结构图:

代码示例:

根据上面的场景描述,我们来实现一下Strategy模式。

首先先定义抽象类(Strategy):

1     public interface IStrategy {
2         void AlgorithmInterface();
3     }

然后定义子类并实现它们,这3个子类分别对应场景中的3种情况。可以看出子类封装了各自的算法(业务规则)。

 1     public class ConcreteStrategyA : IStrategy {
 2         public void AlgorithmInterface() {
 3             Console.WriteLine("穿衣服");
 4             Console.WriteLine("抽根烟,爽!");
 5             Console.WriteLine("刷牙和洗脸");
 6         }
 7     }
 8 
 9     public class ConcreteStrategyB : IStrategy {
10         public void AlgorithmInterface() {
11             Console.WriteLine("穿衣服");
12             Console.WriteLine("刷牙和洗脸");
13         }
14     }
15 
16     public class ConcreteStrategyC : IStrategy {
17         public void AlgorithmInterface() {
18             Console.WriteLine("穿衣服!跑!");
19         }
20     }

下面定义使用算法的类Context,从下面的代码中可以看出Context并不知道它使用的是哪个具体的IStrategy(这个就是类型封装),这样的好处是如果以后增加了新的算法不需要修改Context类。

 1 public class Context {
 2         public Context(IStrategy strategy) {
 3             this.strategy = strategy;
 4         }
 5 
 6         public void ContextInterface() {
 7             this.strategy.AlgorithmInterface();
 8         }
 9         
10         private IStrategy strategy;
11     }

最后是Client类,可以看出选择所用具体子类由Client承担,并转给Context对象,实现了算法的选择和算法的实现相分离。

 1 class Client {
 2         static void Main(string[] args) {
 3             Console.WriteLine("还有30分钟呢,不急 =>");
 4             Context context1 = new Context(new ConcreteStrategyA());
 5             context1.ContextInterface();
 6             Console.WriteLine("==================================");
 7 
 8             Console.WriteLine("还有15分钟 =>");
 9             Context context2 = new Context(new ConcreteStrategyB());
10             context2.ContextInterface();
11             Console.WriteLine("==================================");
12 
13             Console.WriteLine("尼玛,只有5分钟了啊! =>");
14             Context context3 = new Context(new ConcreteStrategyC());
15             context3.ContextInterface();
16             Console.WriteLine("==================================");
17 
18             Console.ReadLine();
19         }

运行的结果:

 总结:

一般来说,只要在分析过程中需要在不同时间应用不同业务规则,就应该考虑使用Strategy模式处理这种变化的可能性。