好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

步步为营 .NET 设计模式学习笔记 三、Strategy(策略模式)

步步为营 .NET 设计模式学习笔记 三、Strategy(策略模式)

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)

Context(应用场景):

1、需要使用ConcreteStrategy提供的算法。

2、 内部维护一个Strategy的实例。

3、 负责动态设置运行时Strategy具体的实现算法。

4、负责跟Strategy之间的交互和数据传递。

Strategy(抽象策略类):

1、 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。

ConcreteStrategy(具体策略类):

2、 实现了Strategy定义的接口,提供具体的算法实现。

现在我以一个我们买电脑时电脑配置装机为示例做个Strategy模式:

首先新建Computer.cs:

view source print ?

public abstract class Computer

  {

     public abstract string MainBoard();

 

     public abstract string Cpu();

 

     public abstract string PhenoType();

 

     public abstract string Memory();

 

     public abstract string HardDisk();

 

     public abstract string Display();

 

      

  }

 然后新建lenovo.cs:

view source print ?

public   class lenovo:Computer

    {

 

        public override string MainBoard()

        {

            return "华硕880G系列" ;

        }

 

        public override string Cpu()

        {

            return "闪龙双核180(2.4GHz)" ;

        }

 

        public override string PhenoType()

        {

            return "集成高性能显卡" ;

        }

 

        public override string Memory()

        {

            return "1G DDRIII" ;

        }

 

        public override string HardDisk()

        {

            return "500G" ;

        }

 

        public override string Display()

        {

            return "19寸宽屏液晶显示器" ;

        }

    }

 然后再建HP.cs:

view source print ?

public   class HP:Computer

    {

        public override string MainBoard()

        {

            return "ATI RS482" ;

        }

 

        public override string Cpu()

        {

            return "速龙 64位 x2 双核5000+" ;

        }

 

        public override string PhenoType()

        {

            return "NV G310 512M" ;

        }

 

        public override string Memory()

        {

            return "2G DDR2 667 " ;

        }

 

        public override string HardDisk()

        {

            return "3200G" ;

        }

 

        public override string Display()

        {

            return "19寸宽屏液晶显示器" ;

        }

    }

然后再新建个买电脑的类BuyComputer.cs:

view source print ?

public   class BuyComputer

    {

        private Computer _computer;

 

        public BuyComputer(Computer computer)

        {

            _computer = computer;

        }

        public string ShowComputerConfigure()

        {

            StringBuilder strCom = new StringBuilder();

            strCom.AppendLine( "你的电脑配置如下:" );

            strCom.AppendLine( "主板是:" + _computer.MainBoard());

            strCom.AppendLine( "处理器是:" + _computer.Cpu());

            strCom.AppendLine( "显卡是:" + _computer.PhenoType());

            strCom.AppendLine( "内存是:" + _computer.Memory());

            strCom.AppendLine( "硬盘是:" + _computer.HardDisk());

            strCom.AppendLine( "显示器是:" + _computer.Display());

            strCom.AppendLine( "己组装完成" );

 

            return strCom.ToString();

        }

 

    }

然后调用它:

view source print ?

public partial class Run : Form

    {

        public Run()

        {

            InitializeComponent();

        }

 

        private void btnRun_Click( object sender, EventArgs e)

        {

            BuyComputer myBuy = new BuyComputer( new lenovo());

             rtbResult.AppendText(myBuy.ShowComputerConfigure());

            myBuy = new BuyComputer( new HP());

             rtbResult.AppendText(myBuy.ShowComputerConfigure());

        }

    }

运行结果如下:

你的电脑配置如下:
主板是:华硕880G系列
处理器是:闪龙双核180(2.4GHz)
显卡是:集成高性能显卡
内存是:1G DDRIII
硬盘是:500G
显示器是:19寸宽屏液晶显示器
己组装完成
你的电脑配置如下:
主板是:ATI RS482
处理器是:速龙 64位 x2 双核5000+
显卡是:NV G310 512M
内存是:2G DDR2 667
硬盘是:3200G
显示器是:19寸宽屏液晶显示器
己组装完成

总结:策略模式和抽象工厂模式很象,区别在于策略模式多了一个统一的接口类,这里是BuyComputer.

欢迎拍砖.

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于步步为营 .NET 设计模式学习笔记 三、Strategy(策略模式)的详细内容...

  阅读:42次