您的位置:首页 > 编程语言 > Java开发

<设计模式14>策略模式

2016-09-12 22:18 316 查看
策略模式通常是对算法的一些封装。

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

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

策略模式中的各个角色:

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

IStragety:策略的抽象

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

首先实现一个策略的接口

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

public class FirstWayStrategy implements IStrategy{

@Override
public void doSomeThings() {
System.out.println("第一种处理方式");
}

}SecondWayStragety:
public class SecondWayStrategy implements IStrategy{

@Override
public 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的逻辑代码,而是重新实现一个抽象类,这样明显增加了系统的稳定性、扩展性,让业务逻辑更加直观。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式 java