设计模式之策略模式

来源:互联网 发布:jquery字符串转换数组 编辑:程序博客网 时间:2024/05/16 14:30

  设计模式的目的是为了增加代码的可重用性和提高软件的可维护性,软件开发中维护和更新的工作量比一开始的工作量大得多,所以说一个好的设计模式有时候是非常必要的,首先让我们来简单介绍设计模式中的策略模式。本系列中的模式来源于Head First设计模式一书中,加上自己学习过程中的心得体会。

  策略就是用来解决问题的,不同的问题就有不同的策略去解决,所以对于一个类似的问题但不同个体会采取不同策略来解决的情况,我们就可以采取策略欧式来解决。比如树中提到的鸭子的模型,鸭子怎么叫就是一个要解决的问题,不同的鸭子有不同的叫法,我们可以把鸭子叫的方式独立出来写成一个接口,然后对这个借口实现各种策略,比如呱呱叫,比如嘎嘎叫等等,要用到鸭子叫的时候就直接调用这些策略就ok了。

  下面具体看一下用JAVA如何实现这种模式,先看一下类图


图中对策略进行了封装,封装成Strategy的一个接口,然后里面有一个work的方法可以实现策略,有三个具体的类StrategyOne,StrategyTwo,StrategyThree分别实现了Strategy接口,它们的策略处理方式也不一样。然后就是StrategyMode类,它有一个Strategy对象用于管理策略,有一个构造函数也有一个展示策略的方法,它可以把它的对象strategy赋值为任意一种策略StrategyOne,StrategyTwo,StrategyThree,然后就可以实现相应的功能,这就是策略模式的简单介绍。

  其实策略模式也就是定义了一堆的算法簇,然后你要实现什么功能,你就只要在算法簇中选择出你自己想要的算法就可以了。

  下面给出具体各个类的实现:

Strategy接口的实现

package StrategyMode;public interface Strategy {//实现策略的方法public void work();}

StrategyMode类的实现

package StrategyMode;public class StrategyMode {private Strategy strategy = null;public StrategyMode(){//选择策略strategy = new StrategyOne();//strategy = new StrategyTwo();//strategy = new StrategyThree();}public void performStrategy(){strategy.work();}public static void main(String [] args){StrategyMode mode = new StrategyMode();mode.performStrategy();}}

StrategyOne,StrategyTwo,StrategyThree的实现

package StrategyMode;class StrategyOne implements Strategy {@Overridepublic void work() {//do somethingSystem.out.println("I am strategy one!");}}class StrategyTwo implements Strategy {@Overridepublic void work() {// do somethingSystem.out.println("I am strategy two!");}}class StrategyThree implements Strategy {@Overridepublic void work() {// do somethingSystem.out.println("I am strategy three!");}}


策略模式优缺点:

优点
1、   提供了一种替代继承的方法,而且既保持了继承的优点(代码重用),还比继承更灵活(算法独立,可以任意扩展);
2、   避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展;
3、   遵守大部分GRASP原则和常用设计原则,高内聚、低偶合;
4、   易于进行单元测试,各个算法区分开,可以针对每个算法进行单元测试;


缺点
1、   因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量;
2、   选择何种算法需要客户端来创建对象,增加了耦合,这里可以通过与工厂模式结合解决该问题;
3、   程序复杂化。


设计原则:

1.找出应用中可能变化之处,把它们独立出来,不要跟那些不能独立的代码混在一起;

2.针对接口编程,不针对实现编程;

3.多用组合,少用继承。

谢谢








0 0
原创粉丝点击