<设计模式14>策略模式

来源:互联网 发布:flickr软件使用方法 编辑:程序博客网 时间:2024/06/03 14:05

策略模式通常是对算法的一些封装

通常当一个问题有多个解决方案的时候,我们会通过if-else来对每个方法进行区分,通过传入的参数来确定具体使用某个方法。但是这样做的话耦合性太高,如果条件很多的时候,if-else就会很复杂。当我们需要进行增加或者减少的时候,就需要对代码的逻辑进行更改。这样就违反了开闭原则。

而策略模式,就能很好的解决这种问题,将各种方案分离开来。


策略模式中的各个角色:

Context:用来操作策略的上下文环境

IStragety:策略的抽象

FirstWayStragety、SecondWayStragety:具体的策略实现。


首先实现一个策略的接口

IStragety:

public interface IStrategy {void doSomeThings();}
实现这个接口,也就是各个算法的实现:

FirstWayStragety:

public class FirstWayStrategy implements IStrategy{@Overridepublic void doSomeThings() {System.out.println("第一种处理方式");}}
SecondWayStragety:

public class SecondWayStrategy implements IStrategy{@Overridepublic void doSomeThings() {System.out.println("第二种处理方式");}}


Context:

public class Context {private IStrategy strategy;public void set(IStrategy strategy){this.strategy = strategy;}public void doSomethings(){if(strategy != null){strategy.doSomeThings();}}}

使用测试:

public class StrategyTest {public static void main(String[] args) {<span style="color:#ff0000;">//不使用策略模式</span>getWay("First");<span style="color:#ff0000;">//使用策略模式</span>Context context = new Context();context.set(new FirstWayStrategy());context.doSomethings();}private static void getWay(String type) {if("First".equals(type)){FirstWayStrategy way = new FirstWayStrategy();way.doSomeThings();}else {SecondWayStrategy way = new SecondWayStrategy();way.doSomeThings();}}}
这两种实现结果是一样的,但是虽然不使用策略模式的第一种方法也进行了一层封装,但是里面还是存在复制的if-else,而通过策略模式,通过不同策略的构建来实现了不同算法的替换,当我们新增一个算法的时候,不是去修改if-else的逻辑代码,而是重新实现一个抽象类,这样明显增加了系统的稳定性、扩展性,让业务逻辑更加直观。





0 0
原创粉丝点击