Spring与策略模式
一:策略模式的定义
策略模式是对算法的包装,把使用算法的责任和算法本身分隔开,委派给不同的对象管理。策略模式通常把一系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。
其类图如下:
如果是要用JAVA类来实现的策略模式,其源代码如下:
/** * * 策略执行 * @author weique.lqf * @version $Id: Context.java, v 0.1 2014-2-9 下午2:32:56 weique.lqf Exp $ */ public class Context { private Strategy stg; public Context(Strategy theStg) { this.stg = theStg; } public void doAction() { this.stg.testStrategy(); } }
策略接口:
/** * * * @author weique.lqf * @version $Id: Strategy.java, v 0.1 2014-2-9 下午2:32:17 weique.lqf Exp $ */ public interface Strategy { void testStrategy(); }
实现类一:
package com.proxy.strategy.impl; import com.proxy.strategy.Strategy; public class PrintStrategy implements Strategy { public void testStrategy() { System.out.print("我要打印!!"); } }
实现类二:
package com.proxy.strategy.impl; import com.proxy.strategy.Strategy; public class WriteStrategy implements Strategy { public void testStrategy() { System.out.println("我要写字!!!"); } }
执行代码:
package com.proxy.strategy; import com.proxy.strategy.impl.PrintStrategy; public class StrategyClient { public static void main(String[] args) { Strategy stgA = new PrintStrategy(); Context ct = new Context(stgA); ct.doAction(); } }
二:spring实现策略模式
现在使用spring的系统可以说是多如牛毛,那么如何在spring模式下实现策略呢?
其实只需要稍微改造下就可以了,因为spring的核心之一就是IOC。
首先修改Contex类:
package com.proxy.strategy; public class ContextSpring { private Strategy stg; /** * Setter method for property <tt>stg</tt>. * * @param stg value to be assigned to property stg */ public void setStg(Strategy stg) { this.stg = stg; } public void doAction() { this.stg.testStrategy(); } }
然后在spring配置文件里面配置,
<bean id="ct" class = "com.proxy.strategy.ContextSpring"> <property name="stg" ref="writeStg"/> </bean> <bean id="writeStg" class = "com.proxy.strategy.impl.WriteStrategy"/> <bean id="printStg" class = "com.proxy.strategy.impl.PrintStrategy"/>
里面选择你将要注入的实现类,然后在执行的代码里面写这样:
package com.proxy.strategy; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class StrategySpringClient { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); ContextSpring ct = (ContextSpring) context.getBean("ct"); ct.doAction(); } }
看,这样就将spring引入了。
但是这样有好处也有坏处,如果我要根据不同的类型,比如说:合同是需要打印的,而情书是需要手写的。假设合同为类型2,情书为类型1,那我们怎么来自动适配?
三:高级版的spring策略模式
首先要修改Context类:
package com.proxy.strategy; import java.util.HashMap; import java.util.Map; /** * * * @author weique.lqf * @version $Id: ContextSpringFactory.java, v 0.1 2014-2-9 下午3:46:09 weique.lqf Exp $ */ public class ContextSpringFactory { private Map<String, Strategy> stgMap = new HashMap<String, Strategy>(); /** * Getter method for property <tt>stgMap</tt>. * * @return property value of stgMap */ public Map<String, Strategy> getStgMap() { return stgMap; } /** * Setter method for property <tt>stgMap</tt>. * * @param stgMap value to be assigned to property stgMap */ public void setStgMap(Map<String, Strategy> stgMap) { this.stgMap = stgMap; } public void doAction(String strType) { this.stgMap.get(strType).testStrategy(); } }
然后修改spring的配置文件:
<bean id="ctf" class = "com.proxy.strategy.ContextSpringFactory"> <property name="stgMap"> <map> <entry key="1" value-ref="writeStg"/> <entry key="2" value-ref="printStg"/> </map> </property> </bean>
执行的入口类修改为:
package com.proxy.strategy; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class StrategySpringClientFactory { public static void main(String[] args) { //外部参数 String type = "1"; ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); ContextSpringFactory ctf = (ContextSpringFactory) context.getBean("ctf"); ctf.doAction(type); //type 2 type = "2"; ctf.doAction(type); } }
然后运行下,看看会有什么结果?
相关推荐
在学习Spring策略模式的过程中,了解Bean的生命周期、依赖注入以及AOP的概念是至关重要的。同时,阅读和理解Spring的源码能帮助我们更好地掌握其工作原理,从而在实际项目中更灵活地运用策略模式。 最后,`pom.xml`...
技术: 1. spring事件驱动(ApplicationEventPublisher) 2. 策略模式处理事件 目的: 1. 通过event,代码逻辑异步处理 2. 通过策略模式,构建具体监听实现 3. 解耦 4. 容错(降低代码块错误风险)
在SpringBoot项目中,策略模式可以与依赖注入机制相结合,实现更加灵活的业务逻辑处理。在本文中,我们将详细介绍如何使用策略模式在SpringBoot项目中实现业务逻辑处理。 策略模式的定义 策略模式是一种行为设计...
本实战应用将探讨如何在Spring项目中有效地整合策略模式,以提高代码的灵活性和可维护性。 首先,策略模式的核心概念是定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换。在Spring中,我们可以利用...
策略模式的核心是将算法的实现与使用算法的环境解耦,使得算法可以根据需要进行替换,而不会影响到整体系统。 在软件开发中,策略模式的应用场景非常广泛。例如,当需要实现支付功能时,可以定义一个`...
14. **策略模式(Strategy)**:Spring AOP中的切面(Aspect)和通知(Advice)可以视为策略模式,不同的通知对应不同的策略,可以根据需要动态选择和组合策略。 15. **命令模式(Command)**:命令模式在Spring ...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式主要通过定义一系列的算法,并将每一个算法封装起来,使得它们可以互相替换,让算法独立于使用它的客户。这种模式的核心在于它能...
在这个项目中,我们将深入探讨如何利用Spring Boot和策略模式来实现多种文件存储方式,包括本地存储和MinIO云存储,并介绍如何设计一个可自定义扩展的架构。 ### Spring Boot简介 Spring Boot的核心优势在于其...
Spring的IoC容器则提供了更高级别的抽象,能够管理多个对象及其依赖关系,支持灵活的配置,并且可以方便地与其他设计模式结合使用,如策略模式、单例模式等。 在Spring中,我们可以通过XML配置文件或Java配置类来...
- **策略模式**:用于提供多种算法或行为,例如不同的事务管理策略。 #### 六、对软件设计的启示 Spring框架的设计为我们提供了很多宝贵的启示: - **松耦合**:通过依赖注入(DI)实现了模块之间的解耦,使得...
本资源是spring的小例子程序,共包括以下7个: 数据访问对象模式(DAO) 工厂模式(factory) 模型视图控制器模式(MVC) ...策略模式(strategy) 模板模式(template) 另外还有一个关于动态代理的小例子
策略模式在 Java 中的应用 - 剔除 if-else 代码,提高代码可读性 在软件开发中,if-else 语句是非常常见的,但是大量的 if-else 语句会使代码变得难以阅读和维护。今天,我们将讨论如何使用策略模式来取代 if-else ...
3 策略模式 4 模板方法模式 5 工厂方法模式 6 抽象工厂模式 7 建造者模式 8 代理模式 9 装饰模式 10 原型模式 11 委派模式 12 适配器模式 设计模式综合运用 1 门面+模版方法+责任链+策略 2 门面+模版方法+责任链+...
今次,则用反射+策略模式来重构一下代码,使之更加灵活。 如果有代码更好的优化方式,请下方留言。 码云:Demo地址 二、不使用反射的策略模式 抽象策略角色(接口) public interface MyStragtegy { String pl
在Java中,策略模式通常结合工厂方法或依赖注入框架(如Spring)来实现,以便更方便地创建和选择策略对象。例如,使用工厂方法可以根据条件创建并返回相应的策略对象,或者在配置文件中指定策略类,由框架在运行时...
- **用途**:Spring框架通过策略模式实现了事务管理等功能的插拔式实现。 - **优势**:使得事务管理机制可以根据具体的应用场景进行灵活调整。 6. **观察者模式**: - **作用**:Spring框架利用观察者模式实现...
8. **策略模式**:Spring允许使用不同的策略类来实现相同的行为,如数据验证、排序等,可以通过配置选择具体的策略。 9. **模板方法模式**:Spring的`JdbcTemplate`和`HibernateTemplate`等都运用了模板方法模式,...
"策略模式消除if-else分支判断"的主题旨在通过引入策略模式和工厂模式来解决这一问题,提高代码的灵活性和可复用性。 策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或...