设计模式深入学习--Strategy 策略模式(行为型模式)

来源:互联网 发布:aspx php混合网站 编辑:程序博客网 时间:2024/05/22 06:38

   这次来说说Strategy 策略模式,Strategy 策略模式在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。 我们先来看看Strategy 策略模式的基本代码。

//抽象状态类 定义一个接口以封装与Context的一个特定状态相关的行为[/size] [size=16px][/size][size=16px]    abstract class Strategy[/size][size=16px]    {[/size][size=16px]        abstract public void AlgorithmInterface();[/size][size=16px]    }[/size][size=16px][/size][size=16px][/size][size=16px]    class ConcreteStrategyA : Strategy[/size][size=16px]    {[/size][size=16px]        public override void AlgorithmInterface()[/size][size=16px]        {[/size][size=16px]            Console.WriteLine("算法接口实例A");[/size][size=16px]        }[/size][size=16px]    }[/size][size=16px][/size][size=16px]    class ConcreteStrategyB: Strategy[/size][size=16px]    {[/size][size=16px]        public override void AlgorithmInterface()[/size][size=16px]        {[/size][size=16px]            Console.WriteLine("算法接口实例B");[/size][size=16px]        }[/size][size=16px]    }[/size][size=16px][/size][size=16px]    class ConcreteStrategyC : Strategy[/size][size=16px]    {[/size][size=16px]        public override void AlgorithmInterface()[/size][size=16px]        {[/size][size=16px]            Console.WriteLine("算法接口实例C");[/size][size=16px]        }[/size][size=16px]    }[/size][size=16px][/size][size=16px][/size][size=16px]    class Context[/size][size=16px]    {[/size][size=16px]        Strategy strategy;[/size][size=16px][/size][size=16px]        public Context(Strategy strategy)[/size][size=16px]        {[/size][size=16px]            this.strategy = strategy;[/size][size=16px]        }[/size][size=16px][/size][size=16px]        public void ContextInterface()[/size][size=16px]        {[/size][size=16px]            strategy.AlgorithmInterface();[/size][size=16px]        }[/size][size=16px]    }[/size] [size=16px]
    首先写一个虚拟的策略类Strategy,里面有一个虚拟方法AlgorithmInterface,然后再写3个实体策略类ConcreteStrategyA,B,C 都继承父类Strategy,然后重写AlgorithmInterface方法,各自输出各自的策略方法,最后在写一个Context内容类,里面包含有一个策略类的引用,ContextInterface方法用来调用自己引用的策略方法AlgorithmInterface() , 现在再来看看实现方法:
Context c1=new Context(new ConcreteStrategyA());       c1.ContextInterface();        Context c2 = new Context(new ConcreteStrategyB());       c2.ContextInterface();        Context c3 = new Context(new ConcreteStrategyC());       c3.ContextInterface();

   状态模式和策略模式使用上看起来基本差不多,但还是分情况的,我也是看了大量资料才理解其中的区别,这个我们先保留意见,在做个小案例,我们再来说说其中的不同。我们玩CS的时候会有切换武器的操作,比如按1换主武器,2是副武器,3是小刀,4是手雷,我们就用策略模式来试着做下。
public interface IWeapons{    void Play();}  public class rifleWeapons : IWeapons{    public void Play()    {        Console.WriteLine("使用步枪攻击远距离敌人");    }}  public class pistolWeapons : IWeapons{    public void Play()    {        Console.WriteLine("使用手枪攻击中距离敌人");    }} public class knifeWeapons : IWeapons{    public void Play()    {        Console.WriteLine("使用刀子攻击远距离敌人");    }} public class grenadesWeapons : IWeapons{    public void Play()    {        Console.WriteLine("使用猴赛雷砸敌人");    }} public class Player{    private IWeapons weapons;     public void SetWeapons(IWeapons w)    {        weapons = w;    }     public void Play()    {        weapons.Play();    }}
首先我们先声明一个武器接口类IWeapons 里面有一个Play方法 然后在写4个子类,就是我们上面说的4种武器,rifleWeapons 主武器类,pistolWeapons副武器类,knifeWeapons 小刀类,grenadesWeapons 手雷类,分别继承IWeapons并重写Play方法,输出自己的作用。然后是我们的Player类,里面管理我们的武器接口,有个Play方法运行武器的Play方法。最后来实现 :

IWeapons weapons = null;        Player player=new Player();        Console.WriteLine("---玩家发现远距离敌人---");        weapons=new rifleWeapons();        player.SetWeapons(weapons);        player.Play();         Console.WriteLine("---玩家发现中距离敌人---");        weapons = new pistolWeapons();        player.SetWeapons(weapons);        player.Play();         Console.WriteLine("---玩家发现近距离敌人---");        weapons = new knifeWeapons();        player.SetWeapons(weapons);        player.Play();         Console.WriteLine("---玩家发现敌人躲起来了---");        weapons = new grenadesWeapons();        player.SetWeapons(weapons);        player.Play();

    结果都正常的输出了,可以看出 我们在调用的时候也是在武器new上我们需要的参数类,然后给到Player,在player下运行Play方法来运行我们不同的策略方法。好,到这一步我们再来对比下和状态模式的区别,从逻辑上来说是状态模式注重的是内在的改变,而策略模式注重的是外在的改变,比如我们肚子饿了,想去吃饭,是吃饭还是吃面包还是吃粉呢,这些食物就是外部的东西,我们没办法看到其内在也不关心,这个时候用策略模式,而当我们选好要吃的食物了,这个时候选择使用什么姿势来吃呢,是蹲着还是坐着,还是站着,这些都是涉及到自身环境的改变,而我们可以去控制的也关心内在的变化就可以用状态模式。
   策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
   在策略模式中,应当由客户端自己决定在什么情况下使用什么具体策略角色。2)
   策略模式仅仅封装算法,提供新算法插入到已有系统中,以及老算法从系统中“退休”的方便,策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定。这在一定程度上提高了系统的灵活性,但是客户端需要理解所有具体策略类之间的区别,以便选择合适的算法,这也是策略模式的缺点之一,在一定程度上增加了客户端的使用难度。

0 0
原创粉丝点击