Posts 【行为型】策略模式详解
Post
Cancel

【行为型】策略模式详解

【行为型】策略模式

定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
定义:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

策略模式优点:
1.相关算法系列 Strategy类层次为Context定义了一系列的可供重用的算法或行为。 继承有助于析取出这些算法中的公共功能
2.提供了可以替换继承关系的办法
3.消除了一些if else条件语句 :Strategy模式提供了用条件语句选择所需的行为以外的另一种选择。当不同的行为堆砌在一个类中时
  很难避免使用条件语句来选择合适的行为。将行为封装在一个个独立的Strategy类中消除了这些条件语句。含有许多条件语句的代码通
  常意味着需要使用Strategy模式
4.实现的选择 Strategy模式可以提供相同行为的不同实现。客户可以根据不同时间 /空间权衡取舍要求从不同策略中进行选择

@link http://blog.csdn.net/hguisu/article/details/7558249

策略模式缺点:
1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类
2.Strategy和Context之间的通信开销
3.策略模式将造成产生很多策略类

UML图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  _ _ _ _ _ _
 |           |
 |   Client  |
 |_ _ _ _ _ _|
       |
       |
  _ _ _↓_ _ _           _ _ _ _ _ _ _ _ _ _
 |           |         |                   |
 |  Context  |←--------| StrategyInterface |
 |_ _ _ _ _ _|         |_ _ _ _ _ _ _ _ _ _|
                                 ↑
                                 |
                     ┌--------------------------┐
              _ _ _ _|_ _ _ _ _ _      _ _ _ _ _|_ _ _ _ _
             |                   |    |                   |
             | ConcreteStrategyA |    | ConcreteStrategyB |
             |_ _ _ _ _ _ _ _ _ _|    |_ _ _ _ _ _ _ _ _ _|

代码

1
2
3
4
public interface Travel{

    public void travelStyle();
}

1
2
3
4
5
6
7
8
9
public class TrainTravel implements Travel{

    @override
    public void travelStyle(){

        System.out.println("Travel by train to Lhasa...");
    }

}

1
2
3
4
5
6
7
8
public class PlanTravel implements Travel{

    @override
    public void travelStyle(){

        System.out.println("Travel by plain to Lhasa...");
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ContextFactory{

    private Travel travel;

    public ContextFactory(Travel travel){

        this.travel = travel;
    }

    public void setTravel(Travel travel){

        this.travel = travel;
    }

    public void run(){

        travel.travelStyle();
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Client{


    public static void main(String[] args){

        ContextFactory contextFactory = new ContextFactory(new TrainTravel());

        contextFactory.run();

        contextFactory.setTravel(new PlainTravel());

        contextFactory.run();

    }

}

运行结果:

    Travel by train to Lhasa...

    Travel by plain to Lhasa...

应用


This post is licensed under CC BY 4.0 by the author.

【结构型】享元模式详解

【行为型】模板方法模式详解