行为型设计模式——策略模式

定义一系列的算法,把它们一个个封装起来,并且使它们之间可以相互替换。此模式使得算法可以独立于使用它们的客户而变化。

适用于

①许多相关的类,仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。

②需要使用一个算法的不同变体。例如,定义一些反映不同空间的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使用策略模式。

③算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法无关的数据结构。

④一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,将相关的条件分支移入它们各自的Strategy类中,以代替这些条件语句。

类图如下

 

 1     internal class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             //618到来
 6             IStrategy strategy = new StrategyA();
 7             SaleMan saleMan = new SaleMan(strategy);
 8             saleMan.SaleManShow();
 9 
10             //双十一到来
11             strategy = new StrategyB();
12             saleMan = new SaleMan(strategy);
13             saleMan.SaleManShow();
14 
15             //春节到来
16             strategy = new StrategyC();
17             saleMan = new SaleMan(strategy);
18             saleMan.SaleManShow();
19         }
20     }
1     /// <summary>
2     /// 抽象策略接口,用于提供统一的策略接口,由具体策略实现
3     /// </summary>
4     internal interface IStrategy
5     {
6         void Show();
7     }
 1     /// <summary>
 2     /// 具体策略A
 3     /// </summary>
 4     internal class StrategyA : IStrategy
 5     {
 6         public void Show()
 7         {
 8             Console.WriteLine("促销活动A,买一送一");
 9         }
10     }
View Code
 1     /// <summary>
 2     /// 具体策略B
 3     /// </summary>
 4     internal class StrategyB : IStrategy
 5     {
 6         public void Show()
 7         {
 8             Console.WriteLine("促销活动B,满1000减免100");
 9         }
10     }
View Code
 1     /// <summary>
 2     /// 具体策略B
 3     /// </summary>
 4     internal class StrategyC : IStrategy
 5     {
 6         public void Show()
 7         {
 8             Console.WriteLine("促销活动C,购买商品参与抽奖,最高奖励华为三折叠手机");
 9         }
10     }
View Code
 1     /// <summary>
 2     /// 上下文类,聚合一个IStrategy对象引用,调用策略
 3     /// </summary>
 4     internal class SaleMan
 5     {
 6         private IStrategy strategy;
 7 
 8         public SaleMan(IStrategy strategy)
 9         {
10             this.strategy = strategy;
11         }
12 
13         //促销员展示具体活动
14         public void SaleManShow()
15         {
16             strategy.Show();
17         }
18     }
View Code

 

posted @ 2025-05-07 16:09  是铭不是明  阅读(11)  评论(0)    收藏  举报