【Java中23种面试常考的设计模式之策略模式(Strategy)---行为型模式】
知识回顾:
>
之前我们讲过的设计模式在这里呦:
【面试最常见的设计模式之单例模式】
【面试最常见的设计模式之工厂模式】
【Java中23种面试常考的设计模式之备忘录模式(Memento)---行为型模式】
【Java中23种面试常考的设计模式之观察者模式(Observer)---行为型模式】
【Java中23种面试常考的设计模式之模板模式(Template)---行为型模式】
【Java中23种面试常考的设计模式之状态模式(State)---行为型模式】
接下来我们要进行学习的是:【Java中23种面试常考的设计模式之策略模式(Strategy)---行为型模式】。
策略模式
策略模式核心思想是:在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
策略模式VS状态模式
无论是从代码实现上,还是类图,策略模式和状态模式几乎都一样,但他们本质上是有所不同的,策略模式是完成一件事有不同实现方式,不同的行为;但是状态模式是某一个对象对应的不同状态,总体还是完成一件事,这件事中对应着不同的状态,你可以简单的把它理解为它只有一种策略,这种策略下对应着多种状态。
解决的问题
有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
应用策略模式的场景
做同一件事情的不同的行为。
生活中关于策略模式应用的场景
- 旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。
- 会员、普通用户、超级会员等等对应不同的打折策略。
等等。。。等等。。。。
生产开发中常用的使用场景
Spring框架中,Resource接口,资源访问策略
- 解决一道算法题目的不同策略。
- 等等。。。。。等等。。。。
策略模式优点与缺点
优点
- 算法可以自由切换。
- 避免使用多重条件判断。
- 扩展性良好。
缺点
- 策略类会越来越多,后期不利于管理与维护。
- 所有策略类都需要对外暴露,不够安全。
核心角色
定义规则接口的Strategy,实现规则接口策略的具体的类,以及使用某种策略的类Context。
UML类图
实现代码
我们举这样一个栗子:一场算法竞赛中,有一道题目非常有意思,有多种解法:假设:解法1:暴力法 解法2:双指针 解法3:线段树
接口策略类
package com.strategy;
interface Strategy {
void solveProblemDifferentsMethods();
}
具体实现类1
package com.strategy;
class BFStrategy implements Strategy{
@Override
public void solveProblemDifferentsMethods() {
// TODO Auto-generated method stub
System.out.println("这道题目我使用暴力解法解决啦。。。。BFStrategy");
}
}
具体实现策略类2
package com.strategy;
class TwoPonterStrategy implements Strategy{
@Override
public void solveProblemDifferentsMethods() {
// TODO Auto-generated method stub
System.out.println("这道题目我使用双指针解法解决啦。。。。TwoPonterStrategy");
}
}
具体实现策略类3
package com.strategy;
class SegmentTreeStrategy implements Strategy{
@Override
public void solveProblemDifferentsMethods() {
// TODO Auto-generated method stub
System.out.println("这道题目我使用线段树解法解决啦。。。。SegmentTreeStrategy");
}
}
设置使用策略的类
package com.strategy;
class Context{
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public void exec(){
strategy.solveProblemDifferentsMethods();
}
}
测试代码
package com.strategy;
public class Main {
public static void main(String[] args){
Strategy strategy=new BFStrategy();
Context context=new Context(strategy);
context.exec();
System.out.println("方案一暴力法成功解决。。。。。");
strategy=new TwoPonterStrategy();
context=new Context(strategy);
context.exec();
System.out.println("方案二双指针法成功解决。。。。。");
strategy=new SegmentTreeStrategy();
context=new Context(strategy);
context.exec();
System.out.println("方案一线段树方法成功解决。。。。。");
}
}
运行结果展示:
好了,到这里【Java中23种面试常考的设计模式之策略模式(Strategy)---行为型模式】就结束了,23种设计模式持续更新汇总中。