设计模式之Strategy(策略模式)
来源:互联网 发布:淘宝买完东西店铺关了 编辑:程序博客网 时间:2024/06/09 22:34
笔者借鉴了《研磨设计模式》中的策略模式,在此做一个总结,以便自己查阅。
1.策略模式的定义:
定义一系列的算法,并把这些算法各自独立的在类中实现,使得客户可以任意调用一个或多个算法。2.策略模式主要解决什么样的问题
策略模式主要的目的是将使用算法的客户和算法分开并独立出来。使得客户可以任意的调用某种算法。
每个计算方式做成一个单独的算法类,从而形成一系列的算法,并且为这一系列算法定义一个公共的接口,这些算法实现是同一接口的不同实现,地位是平等的,可以相互替换。这样一来,要扩展新的算法就变成了增加一个新的算法实现类,要维护某个算法,也只是修改某个具体的算法实现即可,不会对其它代码造成影响。也就是说这样就解决了可维护、可扩展的问题。
3.策略模式的角色
Strategy:
策略接口,用来约束一系列具体的策略算法。Context使用这个接口来调用具体的策略实现定义的算法。
ConcreteStrategy:
具体的策略实现,也就是具体的算法实现。
Context:
上下文,负责和具体的策略类交互,通常上下文会持有一个真正的策略实现,上下文还可以让具体的策略类来获取上下文的数据,甚至让具体的策略类来回调上下文的方法。
4.代码举例
公司里的员工根据不同的职位有不同的工资计算方法,现在针对不同的职位来实现不同的工资计算方法。客户在调用接口的时候只要指明某个员工的职位,Context就会去调用此职位对应的工资计算方法。以下是代码:
public interface Strategy { /** * 计算公司职员工资的具体方法 * @return */String calculatePay();}
每种具体的职位的工资计算类的实现:
/** *总裁的工资计算类 */public class Prisident implements Strategy {@Overridepublic String calculatePay() {return "Get Prisident pay.";}}
/** * 经理的工资计算类 */public class Manager implements Strategy {@Overridepublic String calculatePay() {return "Get Manager pay.";}}
/** * 普通员工的工资计算类 * */public class Staff implements Strategy {@Overridepublic String calculatePay() {return "Get Staff pay.";}}
Context的实现:
/** * 上下文对象,通常会持有一个具体的策略对象 */public class Context {private Strategy strategy ;public Context(Strategy strategy){this.strategy = strategy;}/** * 上下文对客户端提供的操作接口 * @param strategy 客户端指定的具体的工资计算类 * @return */public String calculatePay(Strategy strategy){return strategy.calculatePay();}}
测试类:
/** * test */public class TestStrategy {public static void main(String args[]){//计算Prisident的工资Strategy prisident = new Prisident();String prisident_pay = prisident.calculatePay();//计算Manager的工资Strategy manager = new Manager();String manager_pay = manager.calculatePay();//计算一般员工staff的工资Strategy staff = new Staff();String staff_pay = staff.calculatePay();System.out.println(prisident_pay);System.out.println(manager_pay);System.out.println(staff_pay);}}
结果显示:
Get Prisident pay.
Get Manager pay.
Get Staff pay.
5、扩展
如果想增加一种职位的工资计算方法,比如Salesman,直接实现一个Salesman类,实现接口Strategy的方法calculatePay()即可。不会对现有的其他类造成影响。
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy模式(策略模式)
- 设计模式之strategy策略模式
- 设计模式(DesignPattern)之策略模式(Strategy)
- 设计模式之策略模式(Strategy)
- 设计模式之Strategy(策略模式)
- struts2 返回json
- Gtk+ 教程和资源集合
- JavaScript闭包
- ATL布幔下的秘密之虚函数背后的东西
- 数据库函数依赖
- 设计模式之Strategy(策略模式)
- 已经建好的表添加唯一性约束、主键、外键约束
- linux内核之elf格式
- 13.Android之Back键和Home键
- DWR高级主题之DWR与spring集成(不使用springMVC,不使用注解的实例)
- .NET MVC权限设计思考之切入点
- js实现给导航换背景图片
- select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
- sendmail配置学习