策略模式(Strategy):定义一组算法族,分别封装起来,它们之间可以相互替换。此模式让算法的变化独立于使用算法的客户。
核心思想(个人理解):
1. 对于相互属于同一类但有不同特性的个体,它们绝对相同的行为使用继承实现;略有不同或者将来会有不同的行为使用组合实现。但总的来说,使用组合要好于使用继承。
2. 尽量面向接口编程,不要面向实体对象编程。
以Spring的ServletContextListener为例:
在web project开发中,需要将project放入一个Servlet容器运行(如tomcat),这时,需要一个ServletContextListener来监听并处理Context Initialized事件和Context Destroyed事件;
同时,在使用Log4j记录一些日志时,也需要一个ServletContextListener来监听并处理Context Initialized事件和Context Destroyed事件。也就是说,它们具有相同的需求:一个ServletContextListener。
但是,两者对这个Listener的具体需求却不一样:前者需要加载Spring配置文件,启动和销毁web app的执行环境;而后者则只是启动和销毁log4j的执行执行环境。
这时,就需要两个ServletContextListener的实现:一个ContextLoaderListener用于前者,一个Log4jConfigListener用于后者。但是,对于二者来说,它们并不知道自己的具体类型,因为它们只知道它们所使用的是ServletContextListener。
=============================================================================
=============================================================================
上例中,ServletContextListener的两个具体实现就是定义了两个算法并封装起来,而Servlet容器则是使用这两个算法的客户。
(不过说实话,个人觉得这个例子举得略显牵强,主要是感觉Spring中并没有特别强调使用Strategy的部分。但是,因为Spring遵循的是面向接口编程,所以可以毫不夸张地说,Spring处处都使用了Strategy模式。)