设计模式学习3-Strategy模式

本文通过一个早晨匆忙上班的场景,介绍了策略模式的概念及其在实际编程中的应用方式。策略模式允许在运行时选择算法,将算法的选择与算法的实现分离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景描述:

一觉醒来看下时间还有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模式处理这种变化的可能性。

 

转载于:https://www.cnblogs.com/cjfwu/archive/2013/03/31/2991206.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值