道不远人,深入.net底层技术
业精于勤荒于嬉,行成于思毁于随!
 
  1. 定义:
  2.  

    『策略模式』定义了算法家族,分别封装起来,让它们之间可以互相替换, 此模式让算法的变化, 不会影响到使用算法的客户。

     

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

    将算法封装,使系统可以更换或扩展方法。策略模式的关键是所有子类的目标一致,但实现的方法不同。“殊路同归”可以说是策略模式的最好解释。

     

    使用场合:

    1):有多种算法

    2):多个相似的类仅仅因为行为不同,这时可以将这些类合并并采用策略模式处理这些行为。

    3):一个类中的某个行为中有过多的分支,这时可以将这些行为封装为不同的算法。

    4):希望隐藏算法中采用的一些具体实例。

     

    具体实例:

    1):采用不同的算法压缩数据。

    2):采用不同的方式对同样的数据绘图,如正方形、圆形、矩形。

    3):以不同格式保存数据,如将对象序列化为XML或者二进制格式并保存。

     

  3. 结构图:
  4.  

     

     

     

  5. 事例代码:
  6.  

    namespace Strategy_DesignPattern
    {
        using System;
            

                     //先定义一个策略抽象基类

            abstract class Strategy
            {
                    abstract public void DoAlgorithm();
            }
                    

        //===============================================================================

                    //各子类继承此基类,并重写基类抽象方法

                    class FirstStrategy : Strategy
            {
                    override public void DoAlgorithm()
                    {
                            Console.WriteLine("In first strategy");                        
                    }
            }
            class SecondStrategy : Strategy
            {
                    override public void DoAlgorithm()
                    {
                            Console.WriteLine("In second strategy");                        
                    }
            }

        //===============================================================================

     

                    //=================================== 上下文类(客户类) =====================================

            class Context
            {
                    Strategy s;
     //声明策略基类类型变量
                    public Context(Strategy strat)
                    {
                            s = strat;                        
                    }

                    public void DoWork()
                    {
                            // some of the context's own code goes here
                    }

                    public void DoStrategyWork()
                    {
                            // now we can hand off to the strategy to do some
                            // more work
                            s.DoAlgorithm();
                    }
            }

                    //==================================================================================

     

        /// <summary>
        ///    Summary description for Client.
        /// </summary>
        public class Client
        {
            public static int Main(string[] args)
                    {        
                            FirstStrategy firstStrategy = new FirstStrategy();
                            Context c = new Context(firstStrategy);
                            c.DoWork();
                            c.DoStrategyWork();

                return 0;
            }
        }
    }

 

策略上下文接口

 

定义需要支持的算法接口,由策略上下文接口调用。

 

注意:我这里所说的接口,并不一定就是接口类,实现上在这里是抽象类。

 

包含算法的具体实现。

 

 

posted on 2008-10-11 22:12  扬帆起航  阅读(217)  评论(0编辑  收藏  举报