JAVA设计模式之Strategy模式

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

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

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

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

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

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

看下面类图:

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

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

这种方式灵活性比较高。

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

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

天不负;卧薪尝胆,三千越甲可吞吴。

JAVA设计模式之Strategy模式

相关文章:

你感兴趣的文章:

标签云: