**定义**:定义一组算法,将每个算法都封装其阿里,并且使它们之间可以互换。
## 策略模式的一般模式:
![](https://box.kancloud.cn/2016-06-06_5755340aceb01.jpg)
Context封装角色
---|它也叫作上下文对象,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,
封装可能存在的变化。
Strategy抽象策略角色
---|策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。
ConcreteStrategy具体策略角色
---|实现抽象策略中的操作,该类含有具体的算法。
~~~
public class StrategyT {
public static void main(String[] args) {
//实现某个算法。
Context context = new Context(new ConcreteStrategy());
context.action();
}
}
interface Strategy{
//实现具体的算法操作
public void doSomething();
}
class ConcreteStrategy implements Strategy{
@Override
public void doSomething() {
System.out.println("come on operate some Arithmetics...");
}
}
class Context{
//私有方法指向具体的策略实现者
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void action(){
this.strategy.doSomething();
}
}
~~~
## 一个例子:
诸葛亮锦囊妙计的故事大家都听说过,那么在这个故事中也涉及到一个设计模式的道理。
首先,诸葛亮给赵云三个锦囊,锦囊中分别是三个妙计,赵云在固定的地点打开锦囊,执行其任务,
便能够化险为夷。那么我们用代码去实现这个策略模式吧。
![](https://box.kancloud.cn/2016-06-06_5755340ae4094.jpg)
~~~
public class StrategyTest {
public static void main(String[] args) {
//赵云来到吴国,打开第一个锦囊
System.out.println("-------赵云来到吴国,打开第一个锦囊-----------");
MyContext context1 = new MyContext(new BackDoor());
//执行第一个锦囊妙招
context1.operate();
System.out.println("-------遇到麻烦打开第二个锦囊-------------");
//遇到麻烦打开第二个锦囊
MyContext context2 = new MyContext(new BackDoor());
//执行第一个锦囊妙招
context2.operate();
System.out.println("-------想要溜走,又遇到麻烦---------");
//想要溜走,又遇到麻烦
MyContext context3 = new MyContext(new BackDoor());
//执行第一个锦囊妙招
context3.operate();
}
}
interface IStrategy{
//锦囊中的妙计,实现方法.具体的实现算法
void operate();
}
/**
* 锦囊妙计一
* @author admin
*
*/
class BackDoor implements IStrategy{
@Override
public void operate() {
System.out.println("找乔国老开后门");
}
}
/**
* 锦囊妙计二
* @author admin
*
*/
class GivenGreenLight implements IStrategy{
@Override
public void operate() {
System.out.println("找吴国太开绿灯");
}
}
/**
* 锦囊妙计三
* @author admin
*
*/
class BlockEnemy implements IStrategy{
@Override
public void operate() {
System.out.println("孙夫人断后");
}
}
/**
* 具体的承载妙计的锦囊。
* @author admin
*
*/
class MyContext {
//一个私有对象指向具体的实现算法类。
private IStrategy strategy;
public MyContext(IStrategy strategy) {
this.strategy = strategy;
}
public void operate(){
this.strategy.operate();
}
}
~~~
**策略模式的优点**:
---|算法可以自由切换
---|避免使用多重条件的判断
---|扩展性良好
**策略模式的缺点**
---|策略类数量增多
---|所有的策略类需要对外暴露
**策略模式的使用场景**
---|多个类只有在算法或行为上稍有不同的场景
---|算法需要自由切换的场景
---|需要屏蔽算法规则的场景
- 前言
- 6大设计原则(一)---单一职责原则
- 6大设计原则(二)---里氏替换原则
- 6大设计原则(三)---依赖倒置原则
- 6大设计模式(四)----接口隔离原则
- 6大设计原则(五)---迪米特法则
- 6大设计原则(六)---开闭原则。
- 设计模式(一)---单例模式
- 设计模式(二)---工厂方法模式
- 设计模式(三)---抽象工厂模式
- 设计模式(四)---模板方法模式
- 设计模式(五)---建造者模式
- 设计模式(六)---代理模式
- 设计模式(七)---原型模式
- 设计模式(八)---中介者模式
- 设计模式(九)---命令模式
- 设计模式(十)---责任链模式
- 设计模式(十一)---装饰模式
- 设计模式(十二)---策略模式
- 设计模式(十三)---适配器模式
- 设计模式(十四)---迭代器模式
- 设计模式(十五)---组合模式
- 设计模式(十六)---观察者模式
- 设计模式(十七)---门面模式
- 设计模式(十八)---备忘录模式
- 设计模式(十八)---访问者模式
- 设计模式(二十)---状态模式
- 设计模式(二十二)---享元模式
- 设计模式(二十三)---桥梁模式