-
什么是策略模式
-
策略模式的例子
-
策略模式的优缺点
-
策略模式的使用场景
-
闲言碎语
什么是策略模式
在日常生活中,我们有大量的交通工具可供我们选择,例如步行,骑自行,坐公交等等.这时我们就存在一个选择的,我们可以根据我们需求选择我们的出行方式.而在软件开发中也会存在这种的选择.这时我们就需要用到策略模式了:
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”策略模式包含:
●环境(Context)角色:持有一个Strategy的引用。
●抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
●具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
UML:
策略模式的例子
策略模式的接口
package com.designPattern.strategy;
/**
* 定义抽象接口层
*
* @author Jason
*
*/
public interface Strategy {
// 动作的方法
public void action();
}
具体的环境
package com.designPattern.strategy;
/**
* 环境角色类
*
* @author Jason
*
*/
public class Context {
Strategy strategy;
public Context(Strategy strategy) {
super();
this.strategy = strategy;
}
/**
* 策略方法
*/
public void action() {
strategy.action();
}
}
具体的策略A
package com.designPattern.strategy;
/**
* 公共汽车策略
*
* @author Jason
*
*/
public class BusStrategy implements Strategy {
@Override
public void action() {
System.out.println("做公共汽车!");
}
}
具体的策略B
package com.designPattern.strategy;
/**
* 地铁策略
*
* @author Jason
*
*/
public class SubwayStrategy implements Strategy {
@Override
public void action() {
System.out.println("坐地铁");
}
}
测试函数
package com.designPattern.strategy;
import org.junit.Test;
/**
* 测试
*
* @author Jason
*
*/
public class TestCase {
@Test
public void test() {
Strategy bus = new BusStrategy();//定义出行方式
Context context = new Context(bus);//定义出行
context.action();
}
}
策略模式的优缺点
优点:
(1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
(2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。
缺点:(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
(2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。
策略模式的使用场景
策略模式的使用场景
1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
闲言碎语
像我这样很不喜欢写大量if-else的人.觉得策略模式是个不错的方式!