在编写代码中,会用到各种算法和策略,我们可以根据环境的不同来选择不同的算发或者策略来完成该功能。一些简单的算法:如查找或者排序,我们可以将方法写在一个算法类中,在我们想要使用的时候就调用这个类中的某一个方法就可以了。这种代码方法我们称之为硬编码,如果将来需要在app或者客户端上增加或者修改一种算法,我们就需要去修改客户端代码,而且会导致客户端的代码变得臃肿不利于维护。
解决方法:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。策略模式使得算法可独立于使用它的客户而变化。
Strategy(策略类):定义所有支持的算法的公共接口。 Context使用这个接口来调用某ConcreteStrategy定义的算法。
ConcreteStrategy(具体实现类):封装了具体的算法或者行为,继承于Strategy。
Context:用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
在客户端调用的时候,首先创建一个context上下文对象,然后传入我们想要的算法的对象,这个算法的对象我们已经在客户端通过策略模式实现过了,这个时候我们只需要调用就 可以了。我们在context中的实现方法是ContextInterface(),这个方法正好调用了Strategy接口的方法,而我们实现策略的ConcreteStrategy实现类也因为重写了Strategy类的方法,实现了我们想要的算法,才构成了我们的策略模式
工厂模式和策略模式的区别:工厂模式是创建型模式 ,它关注对象创建,提供创建对象的接口. 让对象的创建与具体的使用客户无关。
策略模式是对象行为型模式 ,它关注行为和算法的封装 。它定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。使得算法可独立于使用它的客户而变化。
感觉工厂模式更灵活包含的使用方式更多,而策略模式仅仅只是一种相对固定的工具。