Maison> 类库下载> java类库> le corps du texte

Spring与策略模式

阿神
Libérer: 2016-11-07 17:45:48
original
1963 Les gens l'ont consulté

一:策略模式的定义

策略模式是对算法的包装,把使用算法的责任和算法本身分隔开,委派给不同的对象管理。策略模式通常把一系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。

其类图如下:

97871e8f-0d17-33f9-968d-dd05769b67fa.jpg

如果是要用JAVA类来实现的策略模式,其源代码如下:

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(); } }
Copier après la connexion

策略接口:

Java代码 /** * * * @author weique.lqf * @version $Id: Strategy.java, v 0.1 2014-2-9 下午2:32:17 weique.lqf Exp $ */ public interface Strategy { void testStrategy(); }
Copier après la connexion

实现类一:

Java代码

package com.proxy.strategy.impl; import com.proxy.strategy.Strategy; public class PrintStrategy implements Strategy { public void testStrategy() { System.out.print("我要打印!!"); } }
Copier après la connexion

实现类二:

Java代码

package com.proxy.strategy.impl; import com.proxy.strategy.Strategy; public class WriteStrategy implements Strategy { public void testStrategy() { System.out.println("我要写字!!!"); } }
Copier après la connexion

执行代码:

Java代码

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(); } }
Copier après la connexion

二:spring实现策略模式

现在使用spring的系统可以说是多如牛毛,那么如何在spring模式下实现策略呢?

其实只需要稍微改造下就可以了,因为spring的核心之一就是IOC。

首先修改Contex类:

Java代码

package com.proxy.strategy; public class ContextSpring { private Strategy stg; /** * Setter method for property stg. * * @param stg value to be assigned to property stg */ public void setStg(Strategy stg) { this.stg = stg; } public void doAction() { this.stg.testStrategy(); } }
Copier après la connexion

然后在spring配置文件里面配置,

Xml代码

    
Copier après la connexion

里面选择你将要注入的实现类,然后在执行的代码里面写这样:

Java代码

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(); } }
Copier après la connexion

看,这样就将spring引入了。

但是这样有好处也有坏处,如果我要根据不同的类型,比如说:合同是需要打印的,而情书是需要手写的。假设合同为类型2,情书为类型1,那我们怎么来自动适配?

三:高级版的spring策略模式

首先要修改Context类:

Java代码

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 stgMap = new HashMap(); /** * Getter method for property stgMap. * * @return property value of stgMap */ public Map getStgMap() { return stgMap; } /** * Setter method for property stgMap. * * @param stgMap value to be assigned to property stgMap */ public void setStgMap(Map stgMap) { this.stgMap = stgMap; } public void doAction(String strType) { this.stgMap.get(strType).testStrategy(); } }
Copier après la connexion

然后修改spring的配置文件:

Xml代码

       
Copier après la connexion

执行的入口类修改为:

Java代码

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); } }
Copier après la connexion

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

97871e8f-0d17-33f9-968d-dd05769b67fa.jpg

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!