问题:
如何让算法和对象分开来,使得算法可以独立于使用它的客户而变化?
方案:
把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。比如定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换,使得算法可独立于使用它的客户而变化。这就是策略模式。
适用情况:
许多相关的类仅仅是行为有异。 “策略”提供了一种用多个行为中的一个行为来配置一个类的方法。即一个系统需要动态地在几种算法中选择一种。当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。一个类定义了多种行为 , 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的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 }