【设计模式之策略模式】
来源:互联网 发布:慈溪行知职高罗老师 编辑:程序博客网 时间:2024/06/14 07:58
前言:
最近在学习设计模式,简单工厂是接触的第一个模式,后来,就遇到了策略模式,策略模式真是有谋略啊!定义了算法家族,有了算法家族,再难的计算都不在话下了!!!今天,我们一起来学习策略模式,看看这是一个怎样的设计模式?
中心:
(一)定义
官方:
它定义了算法家族,分别封装起来起来,让他们之间可以相互替代,此模式让算法的变化,不会影响到使用算法的用户。
个人理解:
定义了一系列的算法,将算法封装在独立的策略类中,既然独立,就可以相互替代,所有的算法完成的是相同的工作,只是实现不同,它以相同的方式调用所有的算法。
相比继承的优点:
继承提供了一种支持多种算法或行为的方法,而继承使得算法父类与子类混合,难以理解、维护、和扩展,还不同的动态的改变算法,这是继承的缺点,正是策略模式的优点。使用策略模式,使得易于切换、理解、和扩展。
(二)结构图
UML图:
例子:
以商场打折为例,可用下图来理解策略模式。
(三)主要代码
Strategy类,定义所有支持的算法的公共接口
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">//抽象算法类 abstract class Strategy { //算法方法 public abstract void AlgorithmInterface(); }</span></span></span>ConcreteStrategy,封装了具体的算法或行为,继承于Strategy
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"> //具体算法A class ConcreteStrategyA:Strategy { //算法A实现方法 public override void AlgorithmInterface() { Console.WriteLine("算法A实现"); } } //具体算法B class ConcreteStrategyB : Strategy { //算法b实现方法 public override void AlgorithmInterface() { Console.WriteLine("算法B实现"); } } //具体算法C class ConcreteStrategyC : Strategy { //算法A实现方法 public override void AlgorithmInterface() { Console.WriteLine("算法C实现"); } }</span></span></span>Context,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"> //上下文 class Context { Strategy strategy; public Context (Strategy strategy) { this.strategy = strategy; } //上下文接口 public void ContextInterface() { strategy.AlgorithmInterface(); } }</span></span></span>客户端代码
<span style="font-size:18px;"><span style="font-size:18px;"> <span style="font-size:18px;">static void Main(string[] args) { Context context; context = new Context(new ConcreteStrategyA()); context.ContextInterface(); context = new Context(new ConcreteStrategyB()); context.ContextInterface(); context = new Context(new ConcreteStrategyC()); context.ContextInterface(); Console.Read(); }</span></span></span>
(四)定位
策略模式,从字面可以理解“出谋划策”,是一种行为,故属于行为型模式。
(五)优缺点
优点:减少耦合,简化测试(单元测试)
缺点:客户端知道所有的类,任务重,造成很多策略类
(六)何时用
1. 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为
2. 一个系统的算法使用的数据不可以让客户端知道。
3. 如果一个对象有很多的行为,
在实践中,只要分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式。
总结:
策略模式,你懂了吗?希望这篇博客,对大家有用!
0 0
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 与关系型数据库相比,MongoDB的优点
- PullScrollView详解(一)——自定义控件属性
- SQL SP_EXECUTESQL
- Latex之BibTex引用参考文献
- Android Studio系列-单元测试入门篇
- 【设计模式之策略模式】
- PullScrollView详解(二)——Animation、Layout与下拉回弹
- Python正则表达式指南
- java发送统计邮件内容html
- slidingmenu 在android 5.0以上手机里面navigationbar虚拟导航自动弹出布局不会自动变换的问题
- iOS NSFileManager文件系统的管理
- PullScrollView详解(三)——PullScrollView实现
- 浅谈:html5和html的区别
- android listview复用机制原理