在开始本文之前,我们先来看下生活中的的一些场景:
比如出行,可以采用公共汽车出行,可以打的出行,可以自驾出行,也可以骑自行车出行等等。我们可以根据天气、距离、时间紧迫等因素决定采用哪一种方式出行。
场景2:购物车支付
比如购物支付,可以采用信用卡、银联、支付宝、微信等方式支付,每种都有各自的算法和行为。
再如采用不同策略完成计费、完成排序等都是在多个现实应用可以找到的。在这些场景中,将算法封装在对象中,这样可以方便地指定和改变一个对象所使用的算法。这个就是我们要聊的策略模式要做的事情。
一、策略模式的基本介绍
1.1 意图
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。策略模式使得算法可独立于使用它的客户而变化。
1.2 结构
策略模式的基本结构如下:
二、策略模式的示例
本文给出一个发短信的示例,平台需要根据不同的省份和场景,通过不同的网关发送短信。
发送短信的方式有如下几种方式:
package com.wangmengjun.tutorial.designpattern.strategy;
public interface MessageStrategy {
void sendMessage(String message, String phone);
}
package com.wangmengjun.tutorial.designpattern.strategy;
public class HySmsStrategy implements MessageStrategy{
@Override
public void sendMessage(String message, String phone) {
System.out.println(String.format("通过自主平台短信网关发送短信,message=[%s],"
+ "phone=[%s]", message, phone));
}
}
package com.wangmengjun.tutorial.designpattern.strategy;
public class CustomerSmsStrategy implements MessageStrategy{
@Override
public void sendMessage(String message, String phone) {
System.out.println(String.format("通过省级短信网关发送短信,message=[%s],"
+ "phone=[%s]", message, phone));
}
}
package com.wangmengjun.tutorial.designpattern.strategy;
public class Sms10086Strategy implements MessageStrategy{
@Override
public void sendMessage(String message, String phone) {
System.out.println(String.format("通过信息调度中心10086发送短信,message=[%s],"
+ "phone=[%s]", message, phone));
}
}
package com.wangmengjun.tutorial.designpattern.strategy;
public class MessageContext {
private MessageStrategy strategy;
public MessageContext(MessageStrategy strategy) {
this.strategy = strategy;
}
public void sendMessage(String message, String phone) {
strategy.sendMessage(message, phone);
}
}
模拟一下根据不同策略来完成简单的短信发送:
package com.wangmengjun.tutorial.designpattern.strategy;
public class StrategyMain {
public static void main(String[] args) {
String message = "Hello, Mengjun";
String phone = "13675830509";
MessageStrategy strategy = new HySmsStrategy();
System.out.println("1. HySmsStrategy -->");
MessageContext context = new MessageContext(strategy);
context.sendMessage(message, phone);
System.out.println("2. CustomerSmsStrategy -->");
strategy = new CustomerSmsStrategy();
context = new MessageContext(strategy);
context.sendMessage(message, phone);
System.out.println("3. Sms10086Strategy -->");
strategy = new Sms10086Strategy();
context = new MessageContext(strategy);
context.sendMessage(message, phone);
}
}
输出结果如下:
1. HySmsStrategy -->
通过自主平台短信网关发送短信,message=[Hello, Mengjun],phone=[13675830509]
2. CustomerSmsStrategy -->
通过省级短信网关发送短信,message=[Hello, Mengjun],phone=[13675830509]
3. Sms10086Strategy -->
通过信息调度中心10086发送短信,message=[Hello, Mengjun],phone=[13675830509]
三、小结
3.1 适合策略模式使用的场景
策略模式是一种行为模式,其是对算法的封装,是把使用算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一些系列的策略类里面,作为一个抽象策略的子类。本模式使得算法可独立于使用它的客户而变化。
在下面的情况下应当考虑使用策略模式:
3.2 几个策略模式的例子
使用策略模式,将行为封装在一个个独立的Strategy类中,可以消除一些条件语句等优点。但是,其也有不足之处,包括: