策略模式与简单工厂模式的结合使用
2014-10-15 11:39
351 查看
Java设计模式中的策略模式(Strategy Patten)定义了一组算法,将每个算法都封装起来,并且可使它们之间可以相互替换,在客户端调用它们时可以互不影响。
策略模式主要由三个角色组成
1、抽象策略角色:通常是一个接口或抽象类实现,我们的具体策略类就是继承或实现这个抽象角色。
2、具体策略角色:我们在这些类中写策略和算法,继承或实现抽象策略角色。
3、环境角色:环境角色中拥有一个抽象策略角色的引用,供客户端调用,该角色把客户端跟策略类的实现分离。
从上面的三个策略模式的角色中,我们就大概可以知道策略模式的编写步骤,这里以实现简单的四则运算为例。
1、定义抽象策略角色,也就是定义一个公共的抽象类(也可以是接口)
2、编写策略类,该类实现上面定义的抽象类
3、编写环境角色,其中持有一个抽象策略类的引用
4、编写客户端
输出结果:
上面只是用到策略模式,下面加上简单工厂模式
工厂类
客户端类
输出结果:
当然这里的工厂类中的if-else的使用是不太好的,简单工厂模式把生成策略类与客户端分离。
总结:
策略模式使开发人员能够开发出很多可替换的组件,而组件间是弱连接的,体现了代码的可重用行,弱连接也为以后开发新的组件打下了基础,具有较强的可扩展性,易于维护。策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给别的对象管理。客户端决定应该使用什么策略,因此客户端需要理解所有具体策略类之间的区别,这也增加了客户端的使用难度。
策略模式主要由三个角色组成
1、抽象策略角色:通常是一个接口或抽象类实现,我们的具体策略类就是继承或实现这个抽象角色。
2、具体策略角色:我们在这些类中写策略和算法,继承或实现抽象策略角色。
3、环境角色:环境角色中拥有一个抽象策略角色的引用,供客户端调用,该角色把客户端跟策略类的实现分离。
从上面的三个策略模式的角色中,我们就大概可以知道策略模式的编写步骤,这里以实现简单的四则运算为例。
1、定义抽象策略角色,也就是定义一个公共的抽象类(也可以是接口)
package strategy; /** * * @author CIACs *定义抽象策略角色 */ public abstract class Strategy { //定义抽象策略的方法 public abstract int strategy(int a,int b); }
2、编写策略类,该类实现上面定义的抽象类
package strategy; /** * * @author CIACs * AddStrategy */ public class AddStrategy extends Strategy { //定义实现加法的策略方法 public int strategy(int a, int b) { return a+b; } }
package strategy; /** * * @author CIACs * SubStrategy */ public class SubStrategy extends Strategy { //定义减法的策略方法 public int strategy(int a, int b) { return a-b; } }
package strategy; /** * * @author CIACs * MultiplyStrategy */ public class MultiplyStrategy extends Strategy { //定义乘法的策略方法 public int strategy(int a,int b) { return a*b; } }
package strategy; /** * * @author CIACs * DivStrategy */ public class DivStrategy extends Strategy { //定义除法的策略方法,这里为了简单就不考虑除数为零的情况了 public int strategy(int a,int b) { return a/b; } }
3、编写环境角色,其中持有一个抽象策略类的引用
package strategy; /** * * @author CIACs * Context */ public class Context { //持有抽象策略角色的引用,用于客户端调用 private Strategy strategy; //获得策略类 public Strategy getStrategy() { return strategy; } //设置所需策略 public void setStrategy(Strategy strategy) { this.strategy = strategy; } //根据设置的策略类返回对应的结果 public int getResult(int a,int b) { return strategy.strategy(a, b); } }
4、编写客户端
package strategy; /** * * @author CIACs * Client */ public class Client { public static void main(String[] args) { Context context = new Context(); int result; context.setStrategy(new SubStrategy()); result = context.getResult(9, 3); System.out.println("sub: "+result); context.setStrategy(new AddStrategy()); result =context.getResult(9, 3); System.out.println("add: "+result); context.setStrategy(new DivStrategy()); result = context.getResult(9, 3); System.out.println("div: "+result); context.setStrategy(new MultiplyStrategy()); result = context.getResult(9, 3); System.out.println("mul: "+result); } }
输出结果:
上面只是用到策略模式,下面加上简单工厂模式
工厂类
package strategy; /** * * @author CIACs * Factory */ public class Factory { public Strategy createStrategy(String str) { if("AddStrategy".equalsIgnoreCase(str)) { return new AddStrategy(); } else if("SubStrategy".equalsIgnoreCase(str)) { return new SubStrategy(); } else if("DivStrategy".equalsIgnoreCase(str)) { return new DivStrategy(); } else if("MultiplyStrategy".equalsIgnoreCase(str)) { return new MultiplyStrategy(); } else return null; } }
客户端类
package strategy; /** * * @author CIACs * Client */ public class Client { public static void main(String[] args) { Context context = new Context(); int result; Strategy strategy; Factory fac = new Factory(); strategy = fac.createStrategy("AddStrategy"); context.setStrategy(strategy); result = context.getResult(9, 3); System.out.println(result); } }
输出结果:
当然这里的工厂类中的if-else的使用是不太好的,简单工厂模式把生成策略类与客户端分离。
总结:
策略模式使开发人员能够开发出很多可替换的组件,而组件间是弱连接的,体现了代码的可重用行,弱连接也为以后开发新的组件打下了基础,具有较强的可扩展性,易于维护。策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给别的对象管理。客户端决定应该使用什么策略,因此客户端需要理解所有具体策略类之间的区别,这也增加了客户端的使用难度。
相关文章推荐
- 策略模式与简单工厂模式的结合使用
- 简单工厂模式和策略模式结合使用php
- 使用简单工厂模式出现程序集不能加载的问题的解决方案
- 设计模式(1)-使用简单工厂优化代码(转载)
- 简单工厂模式--结合实例学习简单工厂模式
- Java技术_每天掌握一种设计模式(003)_使用场景及简单实例(创建型:工厂方法)
- 设计模式(2)结合代码和例子来理解简单工厂模式
- 设计模式(1)-使用简单工厂优化代码
- 策略模式、简单工厂结合
- 3.续策略模式 策略模式与简单工厂模式结合
- Java技术_每天掌握一种设计模式(004)_使用场景及简单实例(创建型:抽象工厂)
- 结合项目实例 回顾传统设计模式(四)工厂模式(简单工厂、普通工厂、抽象工厂)
- 简单工厂与策略模式的结合
- 抽象工厂模式第二步-使用简单工厂模式
- Java反射机制(五):使用反射增强简单工厂设计模式
- 策略模式结合简单工厂模式
- 结合项目实例 回顾传统设计模式(四)工厂模式(简单工厂、普通工厂、抽象工厂)
- java 反射和 工厂模式结合使用
- 解析XML,将数据显示在treeview上,使用简单工厂模式
- 策略模式结合简单工厂模式