策略模式(Strategy Pattern) :定義了一系列的算法, 將每一種算法封裝起來并可以相互替換使用, 策略模式讓算法獨立于使用它的客戶應(yīng)用而獨立變化。
OO設(shè)計原則:
1.面向接口編程(面向抽象編程);
2.封裝變化;
3.多用組合, 少用繼承 ;
當(dāng)一個功能有多種實現(xiàn)方式時, 我們應(yīng)該使用策略設(shè)計模式, 把功能抽象出來, 然后用不同的子類各自提供實現(xiàn)類, 在真正使用時, 根據(jù)業(yè)務(wù)情況來動態(tài)替換
把可變的行為抽象出來, 這樣的好處是這些行為可以在真正使用時相互替換。
策略模式的實際應(yīng)用:
1.數(shù)據(jù)庫操作封裝;
2.微信掃碼登錄注冊綁定操作 ;
舉例說明:將數(shù)據(jù)保存到不同的地方,比如文件、網(wǎng)絡(luò)、數(shù)據(jù)庫中。
a.創(chuàng)建接口,以供不同方式去實現(xiàn)
public interface ISave { public void save(String data); }
b.以供不同方式去實現(xiàn)接口中的方法
public class FileSave implements ISave{ @Override public void save(String data){ System.out.println("把數(shù)據(jù)["+data+"]存儲到文件中"); } }
public class DBSave implements ISave{ @Override public void save(String data) { System.out.println("把數(shù)據(jù)["+data+"]存儲到數(shù)據(jù)庫中"); } }
public class NetSave implements ISave{
@Override public void save(String data) { System.out.println("把數(shù)據(jù)["+data+"]存儲到網(wǎng)絡(luò)中"); } }
c.通過類來組合接口和接口的實現(xiàn)類,自上而下地調(diào)用具體不同對象的相同方法,來實現(xiàn)多態(tài)性
public class DataContext { private ISave iSave; //DataContext只依賴接口,不依賴具體的實現(xiàn)---->面向接口編程
public DataContext(ISave iSave){ this.iSave = iSave; }
public void save1(String data){ iSave.save(data); //通過接口來調(diào)用具體對象的sava方法(父類調(diào)子類方法原理) } }
測試對比:
public class Test { public static void main(String[] args) throws Exception{ //1 依賴了具體類 //1 ISave iSave = new FileSave(); //1 iSave.save("苦戰(zhàn)Java一輩子?。?);
//2 依賴接口(抽象類),具體的對象創(chuàng)建還要通過代碼來改動 //2 DataContext dc = new DataContext(new FileSave()); //2 dc.save1("苦戰(zhàn)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("苦戰(zhàn)Java一輩子??!"); } }
|