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