策略模式
-
策略模式(Strategy Model)
- 属于23种GoF设计模式中的一种。
- 策略模式的描述为:定义了一组算法,并且将这些算法都封装了起来,这些算法之间可以相互的转换使用。
- 通俗点来讲就是一个组件(对象)拥有的同一个行为在不同的环境下表现出来的不同的实现方式。
现实生活中有着不少关于这个方面的例子,比如一个商场会在特定的日期退出各种打折活动,或者在某一个日子退出满减活动,又或者各种会员卡折扣积分的机制等等,都会使我们最后计算商品的成交价的时候带来不同的计算方式,如果这个例子需要程序编写出来,那么使用策略模式无疑是一个很明智的选择。
又或者说在计算不同的税收也是一样,在中国的税收情况和美国或者其他国家的税收情况肯定不同,这也是一个策略模式的使用例子。
策略模式的三个基本特点
- 定义了一组算法或者业务规则,所有算法或业务规则完成的都是完成相同的功能,只是说各自的实现不同;
- 将每一个算法或业务规则都进行了封装;
- 这组定义的算法或业务规则在不同的环境下是可以互相替换使用的。
策略模式的三个组成部分
- 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
- 具体策略角色:封装相关的算法和行为。
- 环境角色:持有一个策略类的引用,给客户端调用。
策略模式小案例
接下来我们就通过一个小案例来加强对策略模式的理解!
情景:(引用自三国演义周瑜赔了夫人又折兵的锦囊妙计的典故)
此时的刘皇叔需要出去江东,临行前诸葛亮给了赵云三个锦囊,需要赵云依次根据锦囊中的妙计行事,从而保证刘皇叔安然无恙的归来,还要恶心一下周瑜!
- 明确各个部分对应关系
抽象策略角色:Strategy
具体策略角色:StrategyFirstImpl,StrategySecondImpl,StrategyThirdImpl
环境角色:StrategyContext - 给出UML图如下:
- 抽象策略角色
/**
* 策略模式 抽象策略角色
* 此处的抽象策略角色使用接口的方式定义
* 这是一个锦囊但是还没有装妙计,妙计存在于具体策略中
* @author WQ
*/
public interface Strategy {
void howToDo();
}
- 具体策略角色
/**
* 策略模式 具体策略角色 角色一
* 包装相关的算法和行为
* 锦囊妙计 第一条
* @author WQ
*/
public class StrategyFirstImpl implements Strategy{
@Override
public void howToDo() {
System.out.println("第一个锦囊:见乔国老,并把刘备娶亲的事情搞得东吴人尽皆知!");
}
}
-------------------------------------------------------------------------------------------------
/**
* 策略模式 具体策略角色 角色二
* 包装相关的算法和行为
* 锦囊妙计 第二条
* @author WQ
*/
public class StrategySecondImpl implements Strategy{
@Override
public void howToDo() {
System.out.println("第二个锦囊:用谎言(曹操打荆州)骗泡在温柔乡里的刘备回去!");
}
}
---------------------------------------------------------------------------------------------------
/**
* 策略模式 具体策略角色 角色三
* 包装相关的算法和行为
* 锦囊妙计 第三条
* @author WQ
*/
public class StrategyThirdImpl implements Strategy{
@Override
public void howToDo() {
System.out.println("第三个锦囊:让孙夫人摆平东吴的追兵,她是孙权妹妹,东吴将领惧她三分!");
}
}
- 环境角色
PS:这里使用的是Switch语句进行条件判定,使用switch语句尤其要注意break的使用!
PS:此处可以使用反射技术替换这里的switch条件判断!
/**
* 策略模式 环境角色
* 持有一个策略类的引用,最终给客户端调用
* 本案例的策略类引用就是持有锦囊
* @author WQ
*/
public class StrategyContext {
//策略类的引用
Strategy strategy = null;
/**
* @param number 第number个锦囊
*/
public StrategyContext(int number){
switch (number){
case 1:
strategy = new StrategyFirstImpl();
break;
case 2:
strategy = new StrategySecondImpl();
break;
case 3:
strategy = new StrategyThirdImpl();
break;
default:
strategy = null;
}
}
/**
* 使用多态的形式调用正确的锦囊妙计
*/
public void getStrategy(){
strategy.howToDo();
}
}
- 测试案例
/**
* 策略模式 客户端
* 该客户端为赵云使用诸葛亮提供的三个锦囊妙计为测试用例
* @author WQ
*/
public class ZhaoYun {
public static void main(String[] args){
//策略模式下的环境角色
StrategyContext context;
//赵云初上江东
context = new StrategyContext(1);
context.getStrategy();
//周瑜实施美人计
context = new StrategyContext(2);
context.getStrategy();
//赵云离江东
context = new StrategyContext(3);
context.getStrategy();
}
}
给出运行结果图:
OK!策略模式的介绍就是这么多啦!