策略模式(Strategy Pattern) :定義了一系列的算法, 將每一種算法封裝起來並能夠相互替換使用, 策略模式讓算法獨立於使用它的客戶應用而獨立變化。 算法
OO設計原則:數據庫
1.面向接口編程(面向抽象編程);編程
2.封裝變化;設計模式
3.多用組合, 少用繼承 ;
微信
當一個功能有多種實現方式時, 咱們應該使用策略設計模式, 把功能抽象出來, 而後用不一樣的子類各自提供實現類, 在真正使用時, 根據業務狀況來動態替換 網絡
把可變的行爲抽象出來, 這樣的好處是這些行爲能夠在真正使用時相互替換。ide
策略模式的實際應用:工具
1.數據庫操做封裝;性能
2.微信掃碼登陸註冊綁定操做 ;
測試
舉例說明:將數據保存到不一樣的地方,好比文件、網絡、數據庫中。
a.建立接口,以供不一樣方式去實現
public interface ISave {
public void save(String data);
}
b.以供不一樣方式去實現接口中的方法
public class FileSave implements ISave{
@Override
public void save(String data){
System.out.println("把數據["+data+"]存儲到文件中");
}
}
public class DBSave implements ISave{
@Override
public void save(String data) {
System.out.println("把數據["+data+"]存儲到數據庫中");
}
}
public class NetSave implements ISave{
@Override
public void save(String data) {
System.out.println("把數據["+data+"]存儲到網絡中");
}
}
c.經過類來組合接口和接口的實現類,自上而下地調用具體不一樣對象的相同方法,來實現多態性
public class DataContext {
private ISave iSave; //DataContext只依賴接口,不依賴具體的實現---->面向接口編程
public DataContext(ISave iSave){
this.iSave = iSave;
}
public void save1(String data){
iSave.save(data); //經過接口來調用具體對象的sava方法(父類調子類方法原理)
}
}
測試對比:
public class Test { public static void main(String[] args) throws Exception{//1 依賴了具體類 //1 ISave iSave = new FileSave(); //1 iSave.save("苦戰Java一生!!");//2 依賴接口(抽象類),具體的對象建立還要經過代碼來改動//2 DataContext dc = new DataContext(new FileSave()); //2 dc.save1("苦戰Java一生!!"); //3 依賴接口(抽象類),具體的對象類脫離到屬性文件中(config.properties),而不是放在代碼中 //讓軟件更加利於維護(提升程序的可擴張性),犧牲性能 Properties prop = new Properties(); //屬性文件工具類 prop.load(Thread.currentThread().getContextClassLoader() .getResourceAsStream("config.properties")); //屬性文件中(config.properties): context.save=NetSave String className = prop.getProperty("context.save"); ISave iSave = (ISave) Class.forName(className).newInstance(); DataContext dc = new DataContext(iSave); dc.save1("苦戰Java一生!!"); }}