策略模式(Strategy Pattern) :定義了一系列的演算法, 將每一種演算法封裝起來并可以相互替換使用, 策略模式讓演算法獨立于使用它的客戶應用而獨立變化,
OO設計原則:
1.面向介面編程(面向抽象編程);
2.封裝變化;
3.多用組合, 少用繼承 ;
當一個功能有多種實作方式時, 我們應該使用策略設計模式, 把功能抽象出來, 然后用不同的子類各自提供實作類, 在真正使用時, 根據業務情況來動態替換
把可變的行為抽象出來, 這樣的好處是這些行為可以在真正使用時相互替換,
策略模式的實際應用:
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一輩子!!");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/134976.html
標籤:設計模式
