博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
步步为营 .NET 设计模式学习笔记 三、Strategy(策略模式)
阅读量:6555 次
发布时间:2019-06-24

本文共 3615 字,大约阅读时间需要 12 分钟。

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。(原文: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模式:
先看个用例图:
2011040209141512.jpg
首先新建Computer.cs:
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:
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:

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:

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();        }    }

然后调用它:

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.

欢迎拍砖.

转载于:https://www.cnblogs.com/springyangwc/archive/2011/04/02/2002809.html

你可能感兴趣的文章
python算法与数据结构-冒泡排序(32)
查看>>
hdu 1032 水题也wrong 两次(于是乎更有刷水题的必要了)
查看>>
hdu 1860 (统计字符)(stl)
查看>>
HDU-1087 Super Jumping! Jumping! Jumping!
查看>>
numpy数组及处理:效率对比
查看>>
composer出现Invalid credentials for ‘https://packagist.phpcomposer.com/packages.json’的错误
查看>>
常用搜索指令
查看>>
ViewPager实现引导页
查看>>
使用XSLT生成Nunit测试报告
查看>>
[分类算法] :朴素贝叶斯 NaiveBayes
查看>>
optional的使用
查看>>
如何恢复误删除的Linux文件
查看>>
重置CentOS6.5的登录口令
查看>>
DES加密
查看>>
SQL-51 查找字符串'10,A,B' 中逗号','出现的次数cnt。
查看>>
Android Apk 瘦身大法
查看>>
Python线程event
查看>>
编译内核开始的小问题Unable to find the Ncurses libraries
查看>>
C# 编程数据结构学习笔记 2
查看>>
初识C++有感
查看>>