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
- C#设计模式——策略模式
- C#设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- C#设计模式之22——策略模式
- c# 设计模式:策略模式
- c#设计模式-策略模式
- 设计模式——策略设计模式
- android *** Layout 13 Adapter
- Thinking in Java---从哲学家就餐问题看死锁现象
- Arduino接口-week4-Lesson1
- 构建高并发高可用的电商平台架构实践
- 分布式视频编码研究第一天PRISM视频编解码
- C#设计模式——策略模式
- Android信使Messenger范例源码
- 遇到字符串操作时谨记
- HTML-03表单的创建
- centos7下恢复网卡名字eth
- HDU 2089 不要62
- 网络游戏到底该服务大众玩家还是大R?
- 【2016】一月份英语学习总结
- coredump详解