问题:
如何让算法和对象分开来,使得算法可以独立于使用它的客户而变化?
方案:
把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。比如定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换,使得算法可独立于使用它的客户而变化。这就是策略模式。
适用情况:
许多相关的类仅仅是行为有异。 “策略”提供了一种用多个行为中的一个行为来配置一个类的方法。即一个系统需要动态地在几种算法中选择一种。当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。一个类定义了多种行为 , 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。
优点:
1、可以动态的改变对象的行为
缺点:
1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类
2、策略模式将造成产生很多策略类
应用:
我们平时出行的方式:出行方式有很多种,具体用哪一种根据动态的选择;
首先创建我们的抽象行为类,和具体的行为类;
1 package strategy;//策略模式
2
3 //抽象的行为类
4 public interface Strategy {
5 public void go();//出行方式
6 }
7
8
9
10
11 package strategy;
12
13 public class ConcreteStrategy1 implements Strategy {//具体的出行方式
14
15 @Override
16 public void go() {
17 // TODO Auto-generated method stub
18 System.out.println("坐公交车!");
19 }
20
21 }
22
23
24
25
26
27 package strategy;
28
29 public class ConcreteStrategy2 implements Strategy {//具体的出行方式
30
31 @Override
32 public void go() {
33 // TODO Auto-generated method stub
34 System.out.println("自驾车!");
35 }
36 }
然后创建一个调用者,也就是使用者,把能使用的行为给导入进来;
1 package strategy;
2
3 public class Context {//环境类其实也就是一个调用类,出行的人
4 private Strategy s;
5
6 public Context(Strategy s) {
7 super();
8 this.s = s;
9 }
10 public void operate(){
11 s.go();
12 }
13 }
最后就是进行出行了;
1 package strategy;
2
3 public class Test {
4 public static void main(String[] args) {
5 Context c =new Context(new ConcreteStrategy1());
6 c.operate();
7
8 c =new Context(new ConcreteStrategy2());
9 c.operate();
10 }
11 }

欢迎大家一起说出自己的想法。