文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。
相关文章:
- Command命令设计模式
- Singleton单例设计模式
- Decorator装饰设计模式
- Template模板模式
- Strategy策略设计模式
- Proxy代理设计模式
- Factory工厂类设计模式
- 设计模式的6大基本原则
文章目录:
策略模式(Strategy Pattern)是行为设计模式之一,它定义了一系列算法,并将每个算法封装起来,使得它们可以相互替换。策略模式让算法在客户端调用它时独立于客户端而变化,即策略模式可以在运行时根据需要选择不同的算法。
1. 模式结构
策略模式涉及以下几个主要角色:
- 策略接口(Strategy Interface):定义所有支持的算法的公共接口,客户端通过这个接口调用具体的策略。
- 具体策略类(Concrete Strategies):实现了策略接口的具体算法或行为。
- 上下文类(Context):维护对策略对象的引用,客户端通过上下文类来调用具体的策略。
2. 优点
- 可扩展性强:可以在不修改现有代码的情况下增加新的策略。
- 避免多重条件语句:策略模式可以替代在代码中使用的条件语句,使代码更清晰、更具可读性。
- 策略之间的独立性:不同的策略是相互独立的变化点,客户端可以根据需要选择使用。
3. 缺点
- 策略类增多:如果策略过多,会导致类的数量增多,增加代码的复杂性。
- 客户端必须了解不同策略的差异:客户端需要知道每个策略的作用,以便选择合适的策略。
4. 使用场景
- 当一个系统有许多类时,而这些类仅在它们的行为(即算法或业务逻辑)上有所不同。
- 需要在不同情况下使用不同的策略,但又不希望使用条件判断语句来选择具体的策略。
- 需要屏蔽算法的实现细节,让算法独立于使用它的客户端。
1.策略模式定义
Strategy模式也叫作行为模式;它对一系列算法进行封装,提供接口,使用哪一种算法,它把选择权交给客户端的用户,使用哪种算法让用户决定。
2.策略模式的特点
(1)提供了可以替换继承关系的方法
(2)也避免了使用多重条件转移语句
策略模式的Demo:
1.方法接口:
package strategypattern2;
public interface MethodInterface {
//方法
public void method();
}
2.方法的实现部分一:
package strategypattern2;
public class WalkMethod implements MethodInterface{
@Override
public void method() {
// TODO Auto-generated method stub
System.out.println("走路!!!");
}
}
3.方法的实现部分二:
package strategypattern2;
public class RunMethod implements MethodInterface{
@Override
public void method() {
// TODO Auto-generated method stub
System.out.println("跑步....");
}
}
4.策略模式调用方法:
package strategypattern2;
/**
*类描述:选择需要的算法
*@author: 张宇
*@date: 日期: 2018年7月30日 时间: 下午7:13:01
*/
public class ContextMethod {
private MethodInterface methodInterface;
public ContextMethod(MethodInterface methodInterface){
this.methodInterface=methodInterface;
}
public void run(){
this.methodInterface.method();
}
}
5.客户端模式的测试类:
package strategypattern2;
/**
*类描述:简单的策略设计模式
*@author: 张宇
*@date: 日期: 2018年7月30日 时间: 下午7:10:04
*/
public class Cilent {
public static void main(String[]args){
ContextMethod context=new ContextMethod(new RunMethod());
context.run();
System.out.println("--------------------------------");
ContextMethod context1=new ContextMethod(new WalkMethod());
context1.run();
}
}
运行结果:
跑步....
--------------------------------
走路!!!
策略模式在选择算法的时候用到,比如:打折活动,对于初级会员打折多少,中级会员打折多少,高级会员打折多少用到策略模式。支付的时候,选择是微信支付,支付宝支付,还是信用卡支付,也是用到策略模式(其实它和工厂设计模式相似)。
策略模式也在spring框架中用到,和抽象工厂一起进行使用的;例如:HierarchicalBeanFactory、ListableBeanFactory、 ConfigurableBeanFactory在进行选择的时候,利用了策略模式进行自动的选择,而不是由我们自己去处理。