策略模式
- 概述:定义一系列的算法,把它们一个个封装起来,并且使他们可以相互替换.这样策略模式使得算法的变化独立于使用算法的客户
- 使用场景
- 在有多种算法相似的情况下,使用if...else所带来的复杂和难以维护
- 一个系统中有很多类,而区分他们的只是他们直接的行为
- 帮助理解:
- 策略模式的核心是对算法的封装
- 该模式重点在于实现对算法(策略)的选择
- 做法就是把需要变化的部分独立出来,这个部分就是算法,因为可能会有多种选择,所以就有了多种算法.形成一个接口,每一个具体策略类实现这个接口就对应这相应的算法,
- 因为是实现的同一个接口,所以算法是可以相互替换的
- 组成角色
- 抽象策略类:定义所有支持的算法的公共接口
- 具体策略类:实现抽象策略类接口的类
- 环境类:维护一个对抽象策略类对象的引用.作为一个入口来调用各个具体策略类
- 优点
- 算法可以自由切换
- 避免使用多重条件判断
- 扩展性好
- 缺点
- 策略类会增多
- 所有策略类都需要对外暴露,并且由客户端来决定使用哪一个
代码实现
示例:对于一个系统需要几种排序方式,但是不想使用if...else的方式来判断具体使用哪一种,使用策略模式的思想来实现这一功能.
抽象策略类
package Strategy;
/**
* Created by looper on 2017/8/17.
*/
public interface Sort {
public void operation();
}
具体策略类1(插入排序方法)
package Strategy;
/**
* Created by looper on 2017/8/17.
*/
public class StraightInsertionSort implements Sort {
@Override
public void operation() {
System.out.println("使用插入排序");
}
}
具体策略类2(堆排)
package Strategy;
/**
* Created by looper on 2017/8/17.
*/
public class HeapSort implements Sort {
@Override
public void operation() {
System.out.println("使用堆排序");
}
}
具体策略类3(快排
)
package Strategy;
/**
* Created by looper on 2017/8/17.
*/
public class QuickSort implements Sort {
@Override
public void operation() {
System.out.println("使用快排");
}
}
环境类
package Strategy;
/**
* Created by looper on 2017/8/17.
*/
public class Strategy {
private Sort sort;
public Strategy(){
}
public void setSort(Sort sort){
this.sort = sort;
}
public void operation(){
this.sort.operation();
}
}
测试类
package Strategy;
/**
* Created by looper on 2017/8/17.
*/
public class StrategyTest {
public static void main(String[] args) {
Strategy strategy = new Strategy();
//使用插入排序
strategy.setSort(new StraightInsertionSort());
strategy.operation();
//使用堆排序
strategy.setSort(new HeapSort());
strategy.operation();
//使用快排
strategy.setSort(new QuickSort());
strategy.operation();
}
}
我将23种设计模式的全部代码上传到CSDN,有用得到的同学 可以去下载.
下载地址 : 点我