`
scholers
  • 浏览: 619603 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring与策略模式

阅读更多

                                               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);
    }
}

  

然后运行下,看看会有什么结果?

 

 

  • 大小: 27.4 KB
分享到:
评论
1 楼 accphc 2016-10-09  
策略工厂实现Spring的ApplicationContextAware接口,就可以直接根据bean的id来取得具体的策略了

相关推荐

    Spring下使用策略模式

    在学习Spring策略模式的过程中,了解Bean的生命周期、依赖注入以及AOP的概念是至关重要的。同时,阅读和理解Spring的源码能帮助我们更好地掌握其工作原理,从而在实际项目中更灵活地运用策略模式。 最后,`pom.xml`...

    spring事件驱动 + 策略模式应用

    技术: 1. spring事件驱动(ApplicationEventPublisher) 2. 策略模式处理事件 目的: 1. 通过event,代码逻辑异步处理 2. 通过策略模式,构建具体监听实现 3. 解耦 4. 容错(降低代码块错误风险)

    详解SpringBoot结合策略模式实战套路

    在SpringBoot项目中,策略模式可以与依赖注入机制相结合,实现更加灵活的业务逻辑处理。在本文中,我们将详细介绍如何使用策略模式在SpringBoot项目中实现业务逻辑处理。 策略模式的定义 策略模式是一种行为设计...

    Spring项目整合策略模式~实战应用

    本实战应用将探讨如何在Spring项目中有效地整合策略模式,以提高代码的灵活性和可维护性。 首先,策略模式的核心概念是定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换。在Spring中,我们可以利用...

    40 Spring AOP策略模式使用及示例实战慕课专栏(1)1

    策略模式的核心是将算法的实现与使用算法的环境解耦,使得算法可以根据需要进行替换,而不会影响到整体系统。 在软件开发中,策略模式的应用场景非常广泛。例如,当需要实现支付功能时,可以定义一个`...

    第四章:Spring AOP API 设计模式1

    14. **策略模式(Strategy)**:Spring AOP中的切面(Aspect)和通知(Advice)可以视为策略模式,不同的通知对应不同的策略,可以根据需要动态选择和组合策略。 15. **命令模式(Command)**:命令模式在Spring ...

    JAVA策略模式实现

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式主要通过定义一系列的算法,并将每一个算法封装起来,使得它们可以互相替换,让算法独立于使用它的客户。这种模式的核心在于它能...

    SpringBoot+策略模式 实现多种文件存储方式

    在这个项目中,我们将深入探讨如何利用Spring Boot和策略模式来实现多种文件存储方式,包括本地存储和MinIO云存储,并介绍如何设计一个可自定义扩展的架构。 ### Spring Boot简介 Spring Boot的核心优势在于其...

    Spring_控制反转_工厂模式

    Spring的IoC容器则提供了更高级别的抽象,能够管理多个对象及其依赖关系,支持灵活的配置,并且可以方便地与其他设计模式结合使用,如策略模式、单例模式等。 在Spring中,我们可以通过XML配置文件或Java配置类来...

    Spring框架的设计理念与设计模式分析

    - **策略模式**:用于提供多种算法或行为,例如不同的事务管理策略。 #### 六、对软件设计的启示 Spring框架的设计为我们提供了很多宝贵的启示: - **松耦合**:通过依赖注入(DI)实现了模块之间的解耦,使得...

    spring中的基本设计模式

    本资源是spring的小例子程序,共包括以下7个: 数据访问对象模式(DAO) 工厂模式(factory) 模型视图控制器模式(MVC) ...策略模式(strategy) 模板模式(template) 另外还有一个关于动态代理的小例子

    策略模式干掉Spring中大片的 if else.docx

    策略模式在 Java 中的应用 - 剔除 if-else 代码,提高代码可读性 在软件开发中,if-else 语句是非常常见的,但是大量的 if-else 语句会使代码变得难以阅读和维护。今天,我们将讨论如何使用策略模式来取代 if-else ...

    Java 经典设计模式讲解以及项目实战

    3 策略模式 4 模板方法模式 5 工厂方法模式 6 抽象工厂模式 7 建造者模式 8 代理模式 9 装饰模式 10 原型模式 11 委派模式 12 适配器模式 设计模式综合运用 1 门面+模版方法+责任链+策略 2 门面+模版方法+责任链+...

    Spring反射+策略模式Demo

    今次,则用反射+策略模式来重构一下代码,使之更加灵活。 如果有代码更好的优化方式,请下方留言。 码云:Demo地址 二、不使用反射的策略模式 抽象策略角色(接口) public interface MyStragtegy { String pl

    策略模式.rar策略模式.rarjava设计模式

    在Java中,策略模式通常结合工厂方法或依赖注入框架(如Spring)来实现,以便更方便地创建和选择策略对象。例如,使用工厂方法可以根据条件创建并返回相应的策略对象,或者在配置文件中指定策略类,由框架在运行时...

    多图详解Spring框架的设计理念与设计模式

    - **用途**:Spring框架通过策略模式实现了事务管理等功能的插拔式实现。 - **优势**:使得事务管理机制可以根据具体的应用场景进行灵活调整。 6. **观察者模式**: - **作用**:Spring框架利用观察者模式实现...

    Spring 设计模式总结1

    8. **策略模式**:Spring允许使用不同的策略类来实现相同的行为,如数据验证、排序等,可以通过配置选择具体的策略。 9. **模板方法模式**:Spring的`JdbcTemplate`和`HibernateTemplate`等都运用了模板方法模式,...

    策略模式消除if-else分支判断.zip

    "策略模式消除if-else分支判断"的主题旨在通过引入策略模式和工厂模式来解决这一问题,提高代码的灵活性和可复用性。 策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或...

Global site tag (gtag.js) - Google Analytics