定义:
该模式定义了一系列算法,并将每个算法封装起来,使它们可以互相替换,且算法的变化不会影响使用算法的用户。
策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现方式分割开来,并委派给不同的对象对这些算法进行管理。
通俗理解:
在现实生活中经常遇到某种目标存在多种策略可供选择的情况。
例如:出行可以选择乘坐火车、汽车、私家车、自行车等。
优点:
1、多重条件语句不易维护,使用策略模式可以避免使用多重条件语句,如if...else 语句、switch...case语句。
2、使用恰当的继承,可以把公共代码转移到父类里面,避免重复代码。
3、策略模式可以提供相同的行为不同的实现,客户可以根据不同时间或空间要求选择不同的。
4、策略模式完美支持开闭原则,可以在不修改原代码的情况下,灵活增加算法。
5、策略模式实现了对算法的使用和实现,二者分离。
缺点:
1、使用者必须了解所有算法的区别,以便选择恰当的算法类。
2、会造成很多策略类,增加维护难度。
策略模式结构:
1、抽象策略类:定义一个公共接口,各种不同算法以不同的方式实现这个接口,环境角色使用这个接口调用不同算法,一般使用接口或者抽象类实现。
2、具体策略类:实现了抽象策略定义的接口,提供具体的算法实现。
3、环境类: 持有一个策略类的引用,最终给客户端调用。
代码实现场景:
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题。
先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜。
上代码:
/**
* 首先定一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口
*/
public interface IStrategy {
//每个锦囊妙计都是一个可执行的算法
public void operate();
}
/**
* 妙计有了,需要把妙计放到锦囊里面
*/
public class Context {
// 构造函数,你要使用那个妙计
private IStrategy iStrategy;
public Context(IStrategy iStrategy) {
this.iStrategy = iStrategy;
}
// 开始使用锦囊
public void operate() {
this.iStrategy.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 ZhaoYun {
/**
* 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计
* @param args
*/
public static void main(String[] args) {
Context context;
System.out.println("-----------刚刚到吴国的时候拆第一个-------------");
context = new Context(new BackDoor());
context.operate();
System.out.println("\n\n");
System.out.println("-----------刘备乐不思蜀了,拆第二个了-------------");
context = new Context(new GivenGreenLight());
context.operate();
System.out.println("\n\n");
System.out.println("-----------孙权的小兵追了,咋办?拆第三个 -------------");
context = new Context(new BlockEnemy());
context.operate();
System.out.println("\n\n");
}
}
注:本文创作思路源于《设计模式之禅》