策略模式(Strategy Model) 属于23种GoF设计模式中的一种。 策略模式的描述为:定义了一组算法,并且将这些算法都封装了起来,这些算法之间可以相互的转换使用。 通俗点来讲就是一个组件(对象)拥有的同一个行为在不同的环境下表现出来的不同的实现方式。
现实生活中有着不少关于这个方面的例子,比如一个商场会在特定的日期退出各种打折活动,或者在某一个日子退出满减活动,又或者各种会员卡折扣积分的机制等等,都会使我们最后计算商品的成交价的时候带来不同的计算方式,如果这个例子需要程序编写出来,那么使用策略模式无疑是一个很明智的选择。 又或者说在计算不同的税收也是一样,在中国的税收情况和美国或者其他国家的税收情况肯定不同,这也是一个策略模式的使用例子。
接下来我们就通过一个小案例来加强对策略模式的理解! 情景:(引用自三国演义周瑜赔了夫人又折兵的锦囊妙计的典故) 此时的刘皇叔需要出去江东,临行前诸葛亮给了赵云三个锦囊,需要赵云依次根据锦囊中的妙计行事,从而保证刘皇叔安然无恙的归来,还要恶心一下周瑜!
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("第三个锦囊:让孙夫人摆平东吴的追兵,她是孙权妹妹,东吴将领惧她三分!");
}
}
/**
* 策略模式 环境角色
* 持有一个策略类的引用,最终给客户端调用
* 本案例的策略类引用就是持有锦囊
* @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!策略模式的介绍就是这么多啦!
End
本文分享自 MoziInnovations 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!