JAVA设计模式之Strategy模式

来源:互联网 发布:淘宝店铺名字 大全 编辑:程序博客网 时间:2024/04/30 23:30

现在需要封装一个算法,但是该算法有很多种不同的实现,比如,一个排序算法,可能有插入排序,冒泡排序,快速排序等不同的实现,而且要求这些算法由使用者来决定具体使用的是哪个算法,如何来设计呢?

 

这是,我们就会用到策略模式了,策略模式,就是将一个算法的不同实现封装成一个个单独的类,这些类实现同一个接口,使用者直接使用该接口来访问具体的算法。这个样子,使用者就可以使用不同的算法来实现业务逻辑了。策略模式的组件如下:

 

策略模式组件图

可见,策略模式中,Context(使用者)通过接口来访问算法的,这样,在运行中,由用户来决定应该选择哪个实现。

 

上一篇中说到模板方法模式,仔细观察下,模板方法模式和策略模式,是不是有种相似的部分呢?

 

假如现在,我们将Strategy换成一个抽象类,你是否觉得恍然大悟呢?其实,策略模式,和模板方法模式有很多相像的地方。模板方法模式中是将不变的逻辑放在父类中,子类只需要实现可变的部分。而在策略模式中,将所有的操作都由各个子类来实现。

 

所以,假如有下面一种情况存在,现在这个算法中有很多不变的部分,那我们该怎么做呢?

 

1、可以定义一个回调类SameCallBack,其中定义一个方法doTheSame(),这样,在每个具体实现类的execute方法中回调这个方法。

看下面类图:

迭代

这样,在Context的doExecute方法中可以如下

 

在每个具体的Strategy实现类中的execute方法,回调这个相同的方法,如下:

 

这种方式灵活性比较高。

 

当然,你也可以使用策略模式和模板模式结合的方式,定义一个抽象类,该抽象类实现Strategy接口,然后所有的具体类来继承该抽象类。在抽象类中实现算法的骨架部分。这样也可以实现。对应的类图如下:

vv

 

这种方式虽然可行,但是没有上一种方式灵活,且这种方式也继承了模板方法模式的缺点,占用了继承。