设计模式 -- 策略模式
2023-09-14 08:59:01 时间
2015年12月10日21:54:25
完成一个功能可能会有好几种算法或者方法来实现,通过对算法和方法的抽象,提供统一接口,不通算法,实现方式为实现类,通过注入不同的实现对象来实现算法,实现方式的灵活切换即为策略模式。
策略模式是针对多种选择的代码片段的优化,是的代码减少修改,符合开闭原则。
- 编码实现就是先将各个算法或者实现方式抽象成一个接口,接口里面是所有实现方式的抽象方法。
- 每增加一种实现方式或者算法实现,就增加一个类实现该接口,并实现里面的抽象方法。
- 最后通过传入不同类的对象来实现不同算法或者实现方式的灵活切换。
优点:逻辑直观,易于扩展。
缺点:每增加一个算法或者实现方式都要实现一个类。类文件会显著增加
感觉设计模式其实就讲的是一种技巧或者写好的代码的捷径。单同时也是牺牲了一部分的,比如类的数量变大了,单却更好的,更优雅的实现比较好的代码。
策略在重构代码中的考量,比如类似 if lese , switch case 这类语句,如果判断很多,其实可以通过策略模式来重构这部分的代码,不至于一大坨,又一大坨的代码块。通过多个实现类的方式,灵活在多种算法,实现方式之间切换。
下面是个减加乘的例子:
首先抽象计算的接口:
/** *抽象接口,高度抽象各个算法和实现方式的实现 */ public interface Strategy { public abstract String calculate(float a,float b); }
然后分别是实现类:
相加:
public class AddStrategy implements Strategy { @Override public String calculate(float a, float b) { return "相加的结果"+(a+b); } }
相减:
1 public class SubStrategy implements Strategy { 2 3 @Override 4 public String calculate(float a, float b) { 5 return "相减运算:"+(a-b); 6 } 7 }
相乘:
public class MultiplyStrategy implements Strategy { @Override public String calculate(float a, float b) { return "成法运算:"+(a*b); } }
工厂类:
public class ContextRole { //拥有一个策略类的引用 private Strategy strategy; public ContextRole(String type){ if (type.equals("+")) { strategy = new AddStrategy(); }else if (type.equals("-")) { strategy = new SubStrategy(); }else if (type.equals("*")) { strategy = new MultiplyStrategy(); } } public String calculate(float a,float b) { return strategy.calculate(a, b); } }
测试类:
public class Test { /** * @Title: main * @Description: TODO(这里用一句话描述这个方法的作用) * @param @param args 设定文件 * @return void 返回类型 * @throws */ public static void main(String[] args) { ContextRole contextRole = new ContextRole("+"); System.out.println(contextRole.calculate(1, 2)); ContextRole contextRole1 = new ContextRole("-"); System.out.println(contextRole1.calculate(1, 2)); ContextRole contextRole2 = new ContextRole("*"); System.out.println(contextRole2.calculate(1, 2)); } }
运行结果:
相加的结果3.0 相减运算:-1.0 成法运算:2.0
相关文章
- java设计模式2--抽象工厂模式(Abstract Factory)
- 设计模式 -- 组合模式 (Composite Pattern)
- 设计模式--原型模式
- 《大话设计模式》--简单工厂模式
- 【设计模式】装饰者模式
- C++设计模式5--单例模式Singleton--当前对象只有一个实例
- 设计模式--Simple Factory 模式
- cocos2d-x设计模式发掘之三:管理者模式
- C#设计模式——代理模式(Proxy Pattern)
- C#设计模式——状态模式(State Pattern)
- 设计模式 -- 代理模式 (Proxy Pattern)
- 设计模式 -- 责任链模式或者叫职责链模式(Chain of Responsibility(CoR))
- 设计模式--状态模式
- 设计模式复习--抽象工厂模式
- 《设计模式之禅》--空对象模式
- 不一样的模板模式(设计模式十一)
- Java设计模式之享元flyweight模式代码示例
- C# 设计模式----抽象工厂模式
- Java设计模式之工厂模式
- Python:设计模式之模型-视图-控制器-MVC复合模式
- 设计模式--模板方法 And State模式
- "围观"设计模式(7)--创建型之单例模式(Singleton Pattern)
- 《Head First 设计模式》学习笔记——复合模式
- 设计模式python版(6)-单例模式
- 【设计模式】深入浅出--外观模式