策略模式详解

来源:互联网 发布:js注册界面 编辑:程序博客网 时间:2024/06/05 14:25

策略模式:(Strategy):
–定义一种算法,将每个算法都封装起来,并且使他们之间可以互换。
–策略模式使这些算法在客户端调用他们的时候能够互不影响的变化。

意义:策略模式可以使开发人员能够开发出由许多可替换的部分组成的软件,并且这个部分之间是弱连接的关系。

–弱连接的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性。

——————————————————————
策略模式的组成:
–抽象策略角色:策略类,通常由一个接口或者抽象类实现。
–具体策略角色:包装了相关的算法和行为。
环境角色:持有一个策略类的引用,最终给客户端调用的。

————————————
策略模式的实现:
–策略模式的用意是针对一组算法,将每一个算法封装到具有封装到具有共同接口的独立的类中,从而使得他们可以相互替换。
—策略模式使得算法可以在不影响到客户端的情况下不发生变化。使用策略模式可以把行为和环境分开来。

–环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境独立开来,算法的修改都不会影响环境和客户端。

策略模式的编写步骤:
1.对策略对象定义一个公共接口
2.编写策略类,该类实现上面的公共接口
3.在使用策略对象的类中保存一个对策略对象的引用。
4.在使用策略对象的类中,实现对策略对象的set和get()方法(注入)或者使用构造方法完成赋值。


实现自己的策略模式:

package com.strategy;/* * 抽象的策略类 * 策略类,通常由一个接口或者抽象类实现。 */public interface strategy{     public  int  calculate(int  a,int b);}

————————

package com.strategy;/* * --具体策略角色:包装了相关的算法和行为。 */public class AddStrategy implements strategy{     @Override     public int calculate(int a, int b)     {           return a+b;     }}

————————

package com.strategy;/* * --具体策略角色:包装了相关的算法和行为。 */public class SubtractStrategy implements strategy{     @Override     public int calculate(int a, int b)     {           return  a-b;     }}

————————

package com.strategy;/* * --具体策略角色:包装了相关的算法和行为。 */public class MultiplyStrategy implements strategy{     @Override     public int calculate(int a, int b)     {           return  a*b;     }}

——————

package com.strategy;/* * --具体策略角色:包装了相关的算法和行为。 */public class DivideStrategy implements strategy{     @Override     public int calculate(int a, int b)     {           return  a/b;     }}

————

package com.strategy;/* * 环境角色:持有一个策略类的引用,最终给客户端调用的。 */public class Environment{     private  strategy  strategy;     public Environment(strategy  strategy)     {           this.strategy=strategy;     }     public strategy getStrategy()     {           return strategy;     }     public void setStrategy(strategy strategy)     {           this.strategy = strategy;     }     public  int  calculate(int a,int b)     {           return  strategy.calculate(a, b);     }}

————————————————————

package com.strategy;public class Client{     public static void main(String[] args)     {           //定义加法策略           AddStrategy addStrategy=new  AddStrategy();           //由环境角色完成计算操作           Environment  environment =new  Environment(addStrategy);           System.out.println(environment.calculate(4, 5));           //定义减法策略           SubtractStrategy  subtractStrategy=new  SubtractStrategy();           //由环境角色完成减法操作           environment.setStrategy(subtractStrategy);           System.out.println(environment.calculate(4,5 ));           //定义乘法策略模式           MultiplyStrategy  multiplyStrategy=new MultiplyStrategy();           //由环境角色完成乘法操作           environment.setStrategy(multiplyStrategy);           System.out.println(environment.calculate(4, 5));           //定义触发策略模式           DivideStrategy  divideStrategy=new  DivideStrategy();           //由环境角色完成触发操作           environment.setStrategy(divideStrategy);           System.out.println(environment.calculate(4, 5));     }}

————————————————————
策略模式缺点:
1.客户端必须使用所有的策略类,并自行决定使用哪一个策略类。
2.造成有很多的策略类。
——————————
解决方法:
–采用工厂方法。

0 0
原创粉丝点击