C#设计模式——策略模式

来源:互联网 发布:excel多张表格数据汇总 编辑:程序博客网 时间:2024/04/20 16:32
商场促销——策略模式:
一、定义:
它是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法与使用算法类之间的耦合。

二、使用技巧:
先定义一个公共接口,然后分别对具体接口实现,再定义那个需要动态改变算法的对象(例如:打球具体打哪个球可以抽象出一个类),最后客户端调用一下即可。

三、应用:
1、策略模式结构图:


2、代码举例展示:
    //把玩球抽象成一个接口    public interface IBall    {        void Play();    }    //将类抽象成实现接口的类    public class Football : IBall    {        public void Play()        {            Console.WriteLine("我喜欢足球");        }    }    public class Basketball : IBall    {        public void Play()        {            Console.WriteLine("我喜欢篮球");        }    }    public class Volleyball : IBall    {        public void Play()        {            Console.WriteLine("我喜欢排球");        }    }    //有一个专门的类来选择哪种球类,并执行接口方法    public class SportsMan    {        private IBall ball;        public void SetHobby(IBall myBall)        {            ball = myBall;        }        public void StartPlay()        {            ball.Play();        }    }    //客户端让用户做出选择,根据不同的选择实例化具体类    class Program    {        static void Main(string[] args)        {            IBall ball = null;            SportsMan man = new SportsMan();            while (true)            {                Console.WriteLine("选择你喜欢的额球类项目(1=足球,2=篮球,3=排球)");                string input = Console.ReadLine();                switch (input)                {                    case"1":                        ball=new Football();                        break;                    case"2":                        ball=new Basketball();                        break;                    case"3":                        ball=new Volleyball();                        break;                }                man.SetHobby(ball);                man.StartPlay();            }        }    }  
运行结果:


3、适用场景:
(1)行为较多时,需要大量的分支判断,为避免,用策略模式;
(2)在分析过程中听到需要在不同时间应用不同的业务规则,就可考虑用策略。
(3)类承担的职责太多时,可用策略模式,将所实现的职责由客户端承担,并转给策略模式的Context对象。

五、优点:
1、继承有助于析取出这些算法中的公共功能,例如打折,返利等都是对实际商品收费的一种方式,通过继承,可以得到他们的公共功能;
2、简化了单元测试,因为每种球的玩法都有自己的类,可以通过自己的接口单独测试。
3、每种球的玩法可保证它没有错误,修改其中任何一个时也不会影响其他。用Switch条件分支。
一句话,优点就是策略模式封装了变化。

六、总结:
面向对象的编程,并不是越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。例如:打折,一种定义一系列算法的方法,从概念来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法与使用算法类之间的耦合。
刘伟老师的博客中,他提到三个问题:分支判断多;违反开闭原则;难复用。而导致产生这些问题的主要原因在于MovieTicket类职责过重,它将各种打折算法都定义在一个类中,这既不便于算法的重用,也不便于算法的扩展。因此我们需要对MovieTicket类进行重构,将原本庞大的MovieTicket类的职责进行分解,将算法的定义和使用分离,这就是策略模式所要解决的问题。
0 0
原创粉丝点击