策略模式

xiaoxiao2021-02-28  41

1.使用场景:

我们需要根据不同的需求给出不同的解决方案,如果使用条件判断,这时候如果有新增的类型就会破坏开放封闭原则,这时候就需要使用策略模式。常用的使用场景有Spring框架中的Resource接口等。

2.UML表示

在策略模式中有以下的几种对象: 2.1环境(Context)角色:持有一个Strategy的引用。 2.2抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。 2.3具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。 具体的UML示意图如下:

 

3.代码实现

 

首先,定义Strategy接口:

public interface Strategy { public double getArea(double a,double b); }

定义Context类:

public class Context { private Strategy strategy;//当前的算法对象 public Context(Strategy strategy) { this.strategy = strategy; } public void setStrategy(Strategy strategy) { this.strategy = strategy; } public void printArea(double a,double b){ System.out.println("图形面积:"+strategy.getArea(a,b)); } }

定义计算各种图形面积的方法(写的不是太严谨,这里只是用作演示):

 

public class Circular implements Strategy{ @Override public double getArea(double a, double b) { if (a==b) return Math.PI*a*b; return -1; } } public class Rectangle implements Strategy { @Override public double getArea(double a, double b) { return a*b; } } public class Triangle implements Strategy { @Override public double getArea(double a, double b) { return a*b/2; } }

简单测试类:

 

public class Client { public static void main(String[] args) { Strategy s1=new Rectangle(); Strategy s2=new Triangle(); Strategy s3=new Circular(); Context ctx=new Context(s3); ctx.printArea(2,2); } }

 

4.总结

 

策略模式实际就是一种对算法进行分离的设计模式,客户端能够自行判断调用哪个算法。 代码链接:https://github.com/memoryexplosion/design_pattern_review/tree/master/src/java/strategy

 

 

 

 

 

转载请注明原文地址: https://www.6miu.com/read-2621464.html

最新回复(0)