首頁 >类库下载 >java类库 >Spring與策略模式

Spring與策略模式

阿神
阿神原創
2016-11-07 17:45:482022瀏覽

一:策略模式的定義

策略模式是對演算法的包裝,把使用演算法的責任和演算法本身分隔開,委派給不同的物件管理。策略模式通常把一系列的演算法包裝到一系列的策略類別裡面,當作一個抽象策略類別的子類別。

其類別圖如下:

Spring與策略模式

如果是要用JAVA類別來實現的策略模式,其原始程式碼如下:

Java程式碼  

rrrereee

Java碼  

rrrereee

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

實作類別二:

Java程式碼  

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

現在使用spring的系統可以說是多如牛毛,那麼如何在spring模式下實現策略呢?

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

先修改Contex類別:

Java程式碼

  

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

然後在spring設定檔裡面配置,

Xml :

Java程式碼  

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

看,這樣就將spring引入了。

但是這樣有好處也有壞處,如果我要根據不同的類型,比如說:合約是需要列印的,而情書是需要手寫的。假設合約為類型2,情書為類型1,那我們怎麼來自動適配?

三:進階版的spring策略模式

首先要修改Context類別:

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();  
    }  
}
為:

Java程式碼  

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

然後運作下,看看會有什麼結果?

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn