- 前言
- 定义
- 优点
- 缺点
- 模式的结构与实现
- 模式的结构
- 模式的实现
- 应用场景
个人建议设计模式这一系列的文章,多关注定义和模式的代码实现。
至于模式结构和扩展或者是应用场景,基本了解过一下就好,没必要硬记。
这只是我的个人建议,同学们当然可以自己选择知识消化。
鲁迅曾说过:对代码相关的概念,如果理解不了,就狠狠的实践它吧!实践的多了,就自然懂了。
定义
- 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。
策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
优点
- 可以避免使用多重条件语句
- 提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的。
- 提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法。
- 把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。
缺点
- 具体策略类多的时候,会增加一定程度的维护难度。
- 客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类。
模式的结构与实现
模式的结构不同的具体策略类有不同的算法实现,当然实现的是同一目标。策略模式的重心不是如何实现算法,而是如何组织这些算法,从而让程序结构更加灵活,具有更好的维护性和扩展性。
角色如下:
- 【抽象策略类】定义了一个公共接口,各种不同的算法以不同的方式实现这个接口。
- 【具体策略类】实现了抽象策略定义的接口,提供具体的算法实现。
- 【环境类】持有对策略类的引用,提供给客户端调用。
模式的实现
- 【抽象策略类】,代码如下:
package com.example.designmodedemo.principle.strategy; public interface AbsStrategy { // 定义排序方法 void sort(); }
- 【具体策略类 1】,代码如下:
package com.example.designmodedemo.principle.strategy; public class Iml1Strategy implements AbsStrategy{ @Override public void sort() { System.out.println(":> 排序使用选择算法"); } }
- 【具体策略类 2】,代码如下:
package com.example.designmodedemo.principle.strategy; public class Iml2Strategy implements AbsStrategy{ @Override public void sort() { System.out.println(":> 排序使用冒泡算法"); } }
- 【环境类】,代码如下:
package com.example.designmodedemo.principle.strategy; public class MyContext { private AbsStrategy absStrategy; public AbsStrategy getAbsStrategy() { return absStrategy; } public void setAbsStrategy(AbsStrategy absStrategy) { this.absStrategy = absStrategy; } public void sort(){ absStrategy.sort(); } }
- 【客户端】,调用代码如下:
private void principle_strategy() { MyContext myContext = new MyContext(); myContext.setAbsStrategy(new Iml1Strategy()); myContext.sort(); System.out.println(":> --- 使用新算法 ---"); myContext.setAbsStrategy(new Iml2Strategy()); myContext.sort(); }
-【运行结果】,如下图示:
应用场景
- 系统中各算法彼此完全独立,且要求对客户隐藏具体算法的实现细节时。
- 一个系统需要动态地在几种算法中选择一种时,可将每个算法封装到具体策略类中。
- 系统要求使用算法的客户不应该知道其 *** 作的数据时,可使用策略模式来隐藏与算法相关的数据结构。
- 一个类定义了多种行为,并且这些行为在这个类的 *** 作中以多个条件语句的形式出现,可将每个条件分支移入它们各自的策略类中以代替这些条件语句。
技术永不眠!我们下期见!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)