设计模式之策略模式

java设计模式之策略模式

如果存在一种行为在多种情况下的实现,一般情况下可能会使用if...else if...else..来实现。但是每增加一种情况就要增加一种if判断,这样不符合java设计的规范,这时,就可以使用策略模式来替换这种繁琐的if..else

策略设计模式是行为设计模式的一种.当使用多种算法(条件)解决一个特殊的任务的时候,由客户端决定使用哪种具体算法进行特定的实现时,可以使用策略模式.

哪种情况会使用策略模式

以下情况可以使用策略模式:

  1. 许多相关类只有行为上有所不同,策略模式可以通过相同的行为方法(接口方法)来配置这些类.
  2. 当需要使用到算法的变种的时候,当定义不同的行为参数,如果使用类的层次结构实现的时候,可以使用策略模式(当使用方法层次结构的时候就是多态)
  3. 客户端不用清楚算法的细节实现,只需关注接口.避免暴露具体的类的实现、特殊算法的数据结构.
  4. 一个类定义了多种不同的行为,并且使用杂乱的条件进行判断具体使用哪一个条件,这时候就可以使用策略模式来代替,对不同的策略形成不同的类.可以清晰的表达出类的作用与实现的行为方式.

策略模式结构

策略模式类图

如上图定义一个总的Traffic接口,里面有一个go()方法.使用carwalk两种策略(算法)分别来实现接口.

Context类是环境类,持有一个TrafficStrategy的引用,隐藏具体的策略接口的实现,让客户端专注于方法的调用.

代码实现

策略模式接口和策略的实现类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public interface TrafficStrategy {
void go();
}
public class WalkStrategy implements TrafficStrategy{
@Override
public void go() {
System.out.println("i am walking");
}
}
public class CarStrategy implements TrafficStrategy {

@Override
public void go() {
System.out.println("i am driving");
}
}

context类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Context {
private TrafficStrategy trafficStrategy;

public Context(TrafficStrategy trafficStrategy) {
this.trafficStrategy = trafficStrategy;
}

public TrafficStrategy getTrafficStrategy() {
return trafficStrategy;
}

public void setTrafficStrategy(TrafficStrategy trafficStrategy) {
this.trafficStrategy = trafficStrategy;
}

public void doStrategy(){
trafficStrategy.go();
}
}

App客户端类:

1
2
3
4
5
6
public class App {
public static void main(String[] args) {
Context context = new Context(new CarStrategy());
context.doStrategy();
}
}
-------------本文结束感谢您的阅读-------------

本文标题:设计模式之策略模式

文章作者:NanYin

发布时间:2019年05月27日 - 12:05

最后更新:2020年04月02日 - 14:04

原始链接:https://nanyiniu.github.io/2019/05/27/2019-05-28-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。