策略模式

限于喜欢 提交于 2019-11-26 15:44:42

上一篇文章中介绍了简单工厂模式,一个简单的银行系统开始初现端倪,现在我们开始为银行增加一个货币兑换业务,我们只需增加一个业务类,并实现IOperation接口就行了:

 1ExpandedBlockStart.gifContractedBlock.gif    /**//// <summary>
 2    /// 汇兑业务
 3    /// </summary>

 4    class Exchange : IOperation
 5ExpandedBlockStart.gifContractedBlock.gif    {
 6        public void operation()
 7ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 8            Console.WriteLine("you are exchanging!");
 9        }

10    }

然后再在简单工厂类中加上一个判断:

 1            switch(operation)
 2ExpandedBlockStart.gifContractedBlock.gif            {
 3                case "turn":
 4                    opera = new TurningBox();
 5                    break;
 6                case "out":
 7                    opera = new OutingBox();
 8                    break;
 9                case "exchange":
10                    opera = new Exchange();//汇兑业务
11                    break;
12                default:
13                    opera = new SavingBox();
14                    break;
15            }

也就是说我们每为银行增加一个业务都要重复以上两步操作,很明显,在银行业务很多的情况下,如缴费、汇款、理财等,用户每提出一个需求,简单工厂类都会通过switch来判定应该初始化哪一个业务类的执行效率是极其低下的,这为我们提出了新的挑战,就是策略模式。

单从用户这方面来考虑,如果用户手里有一笔钱,用户可以用来存款、也可以用来缴费、还可以用来转账;也就是说,用户有不同的选择方式,我们把用户的选择看成是策略,用户应该执行哪一种策略呢?

把简单工厂模式中的程序演化一下:

 1    interface IStrategy
 2ExpandedBlockStart.gifContractedBlock.gif    {
 3        void operation();
 4    }

 5ExpandedBlockStart.gifContractedBlock.gif    /**//// <summary>
 6    /// 汇兑
 7    /// </summary>

 8    class ExchangeStrategy : IStrategy
 9ExpandedBlockStart.gifContractedBlock.gif    {
10        public void operation()
11ExpandedSubBlockStart.gifContractedSubBlock.gif        {
12            Console.WriteLine("you are exchanging!");
13        }

14    }

15ExpandedBlockStart.gifContractedBlock.gif    /**//// <summary>
16    /// 转账
17    /// </summary>

18    class TurningBoxStrategy : IStrategy
19ExpandedBlockStart.gifContractedBlock.gif    {
20        public void operation()
21ExpandedSubBlockStart.gifContractedSubBlock.gif        {
22            Console.WriteLine("you are turning!");
23        }

24    }

25ExpandedBlockStart.gifContractedBlock.gif    /**//// <summary>
26    /// 取款
27    /// </summary>

28    class OutingBoxStrategy : IStrategy
29ExpandedBlockStart.gifContractedBlock.gif    {
30        public void operation()
31ExpandedSubBlockStart.gifContractedSubBlock.gif        {
32            Console.WriteLine("you are outing!");
33        }

34    }

35ExpandedBlockStart.gifContractedBlock.gif    /**//// <summary>
36    /// 储存
37    /// </summary>

38    class SavingBoxStrategy : IStrategy
39ExpandedBlockStart.gifContractedBlock.gif    {
40        public void operation()
41ExpandedSubBlockStart.gifContractedSubBlock.gif        {
42            Console.WriteLine("you are saving!");
43        }

44    }
然后再增加一个用户选择策略类:
 1    class ClientChoose
 2ExpandedBlockStart.gifContractedBlock.gif    {
 3        private IStrategy strategy;
 4        public ClientChoose(IStrategy strategy)
 5ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 6            this.strategy = strategy;
 7        }

 8        public void operation()
 9ExpandedSubBlockStart.gifContractedSubBlock.gif        {
10            strategy.operation();
11        }

12    }

OK,当一个要求汇兑的用户来到银行时,先应选择策略,然后执行操作:

1    class Program
2ExpandedBlockStart.gifContractedBlock.gif    {
3        static void Main(string[] args)
4ExpandedSubBlockStart.gifContractedSubBlock.gif        {
5            ClientChoose ExChangeClient = new ClientChoose(new ExchangeStrategy());
6            ExChangeClient.operation();
7            Console.ReadKey();
8        }

9    }

策略模式与简单工厂模式的区别:

1.策略模式增加了客户端的主动性,客户自行选择策略,但智能化程度低下,因为客户必须首先了解银行提供了哪些服务,这些服务分别是什么?

2.简单工厂模式适合于用户的选择有限的情况,当用户选择较大时,通过服务器端的判断会大大增加服务器的负载;

3.一些情况下,将简单工厂模式和策略模式混合使用效果更好。

转载于:https://www.cnblogs.com/cdutedu/archive/2008/10/07/1305294.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!