前言
使用策略模式可以代替多重if-else
和switch
语句,让代码维护变得更加简单,乍一看跟工厂模式一模一样,下面是个简单的例子。策略模式包含以下三种角色:
- 环境(Context)角色:持有一个Strategy的引用
- 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现
- 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为
示例
抽象策略角色:定义策略接口
public interface Weather {
//对应的行为
void action();
}
具体策略角色:实现策略接口
/**
* @author jhz
* @date 18-10-31 下午8:18
*/
public class Sunny implements Weather {
@Override
public void action() {
System.out.println("涂防晒霜!");
}
}
/**
* @author jhz
* @date 18-10-31 下午8:17
*/
public class Rainy implements Weather {
@Override
public void action() {
System.out.println("打伞!");
}
}
/**
* @author jhz
* @date 18-10-31 下午8:19
*/
public class Snowly implements Weather {
@Override
public void action() {
System.out.println("穿雪地鞋!");
}
}
环境角色:持有策略对象
/**
* @author jhz
* @date 18-10-31 下午8:20
*/
public class Action {
//策略对象
private Weather weather;
public Action(Weather weather){
this.weather = weather;
}
public void doAction(){
weather.action();
}
}
客户类
/**
* @author jhz
* @date 18-10-31 下午8:24
*/
public class Client {
public static void main(String[] args) {
Weather sunnyDay = new Sunny();
new Action(sunnyDay).doAction();
}
}
小结
看到这儿,相信大家跟我有一样的感觉,这跟简单工厂模式有个啥区别,我们看下策略模式的UML图:
对比一下工厂模式的UML:(盗图)
从UML看也差不多,环境类可以充当一个策略工厂,它们真正的不同如下:
1、用途:工厂是创建型模式,策略是行为型模式。(差点把刘伟老师上课教的给忘了,https://blog.youkuaiyun.com/LoveLion?viewmode=contents)前者是为了创建对象,后者是为了选择行为。
2、关注点不同,前者关注对象创建,后者关注行为封装。
3、工厂相当于黑盒,策略相当于白盒。