策略模式思想
策略模式是一种行为型设计模式。
思想:针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换。策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。
组成
略模式涉及到3个角色
- 环境(Context):持有一个抽象策略的引用,是策略的调用者。
- 抽象策略(Strategy):所有具体策略的抽象。
- 具体策略(Concrete Strategy):封装了算法和行为的具体策略。
案例前言
刘备要到江东娶孙尚香了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的。
先说这个场景中的要素:三个妙计、一个锦囊、一个赵云,妙计是诸葛同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,然后执行,最后获胜。
案例代码实现
抽象策略角色这个是一个抽象的角色,通常情况下使用接口或者抽象类去实现。
策略接口,即妙计接口。
// 诸葛亮老人家给赵云的三个锦囊妙计的接口
public interface IStrategy {
// 业务逻辑,每个锦囊妙计都是一个可执行的算法
public void operate();
}
具体策略角色包装了具体的算法和行为。
三个实现类,也就是三个具体的妙计。
// 策略实现,找乔国老帮忙,使孙权不能杀刘备
public class BackDoor implements IStrategy {
@Override
public void operate() {
System.out.println("找乔国老帮忙,让吴国太给孙权施加压力!");
}
}
public class GivenGreenLight implements IStrategy {
@Override
public void operate() {
System.out.println("求吴国太开个绿灯,放行!");
}
}
public class BlockEnemy implements IStrategy {
@Override
public void operate() {
System.out.println("孙夫人断后,挡住追兵!");
}
}
环境角色内部会持有一个抽象角色的引用,给客户端调用。
存放策略的地方,即放妙计的锦囊。
// 存放具体策略并执行相应的策略,存放妙计的锦囊
public class Context {
private IStrategy straegy;
public Context(IStrategy strategy){
this.straegy = strategy;
}
public void operate(){
this.straegy.operate();
}
}
执行具体策略,即由赵云来打开锦囊中的妙计。
// 赵云依次拆开锦囊
public class ZhaoYun {
public static void main(String[] args) {
Context context = null;
System.out.println("-----------刚刚到吴国的时候拆第一个-------------");
context = new Context(new BackDoor()); //拿到妙计
context.operate(); //拆开执行
//刘备乐不思蜀了,拆第二个了
System.out.println("-----------刘备乐不思蜀了,拆第二个了-------------");
context = new Context(new GivenGreenLight());
context.operate(); //执行了第二个锦囊了
System.out.println("-----------孙权的小兵追了,咋办?拆第三个-------------");
context = new Context(new BlockEnemy());
context.operate(); //孙夫人退兵
}
}
运行结果。
JDK 使用到的策略模式
Comparable 排序接口,内部比较器。
Comparator 比较器接口,外部比较器。
类实现 Comparable 排序接口,重写 public int compareTo(T o);
方法,使用自己的算法对类对象排序。
TreeMap,存放需要对对象排序的集合,可以传入一个自定义的 Comparator 接口实现类,用来进行排序判断逻辑。