設計模式 行為型模式 策略模式

2021-08-02 02:48:59 字數 3168 閱讀 8818

1.定義:定義了一組演算法並分別封裝,使彼此之間可以相互替換,該模式下演算法的變化不會影響到使用演算法的客戶端

3.涉及角色

1.抽象策略:該組演算法的最上層介面,定義了該組演算法需要實現的行為

2.具體策略:具體行為的實現者,是抽象策略的子類

3.策略上下文:持有抽象策略例項,遮蔽高層模組對具體策略的直接訪問,封裝了可能存在的變化,有承上啟下的作用

4.優點

1.演算法可以自由切換。只要實現了抽象策略,那麼實現類就屬於演算法家族

2.隔離高層模組對策略演算法的直接訪問

3.避免大量的判斷邏輯。該模式下使用具體策略的動作轉交給了客戶端,也就是有客戶/具體的模組選擇使用具體的策略

4.擴充套件靈活

5.缺點

1.隨著策略類增加,系統中會存在大量的策略類,為了避免該種情況的發生可以採用多種模式優化(工廠+策略+門面)

2.所有的策略類都需要暴露,因為客戶端決定使用具體的策略,也就是說客戶端必須知道系統中存在的所有策略,方便選擇合適的策略

6.使用場景

1.多個類只在行為上稍有不同,也就是說對外提供的行為基本一致或者相似,具體的細節不同,該場景下可以考慮使用該模式

2.需要遮蔽具體演算法規則的場景。即知道名字,知道輸入,給定輸入後返回結果即可。中間的細節不用了解

3.只用者需要自由切換演算法的場景下。eg:演算法持續進化。

7.code

//抽象策略

public abstract class xmlpraserabstract catch (filenotfoundexception e)  catch (exception e)  finally 

return parser;

} public abstract t parserxml(context context, string filename) throws exception;

}

策略使用上下文

public class xmlprasercontext

public t praserxml(context context, string filename) throws exception

}

具體策略

public class initxml extends xmlpraserabstract

} else if (eventtype == xmlpullparser.start_tag) else if ("channel".equalsignorecase(tagname)) else if ("ara-accessrule".equalsignorecase(tagname)) else if ("arf-accessrule".equalsignorecase(tagname))

}eventtype = parser.next();

}return initnode;

} catch (xmlpullparserexception | ioexception e) catch (exception e) }}

@override

try

}if (eventtype == xmlpullparser.start_tag)

}eventtype = parser.next();

}} catch (filenotfoundexception e) catch (exception e)

}}

當具體策略比較多時,採用混合模式實現邏輯

//抽象策略

//抽象策略

public inte***ce abstractstrategy

//具體策略

public class add implements abstractstrategy 

}public class division implements abstractstrategy

return a / b; }}

public class mixedoperation implements abstractstrategy

return (((a + b) * a) / ( a- b)) - 5.00; }}

......

策略使用上下文

/**

* 策略上下文,實現策略的自由切換

* */

public class context

public double calculate(double a, double b)

}

//抽象策略工廠

/**

* 策略工廠,通過傳入具體的條件生成具體的策略.條件可以有配置檔案儲存.這裡採用列舉

* */

public inte***ce istrategyfactory

具體策略工廠

public class strategyfactory implements istrategyfactory  catch (exception e) 

}}

策略門面

/**

* 採用門面模式隔離對策略工廠及策略上下的訪問

* */

public class strategyfacade

public double calculate(double a, double b, strategyenum strategyenum)

}

客戶端

public static void main(string args) 

}

策略列舉

/**

* 策略列舉型別,採用列舉隔離具體的策略,後續策略增加只需要將策略類路徑新增在該檔案即可

* */

public enum strategyenum

public string getstrategyname()

}

設計模式 行為型模式 策略模式

電影票類 環境類 class movieticket 注入乙個折扣類物件 public void setdiscount discount discount public double getprice 折扣類 抽象策略類 inte ce discount 學生票折扣類 具體策略類 class st...

設計模式 行為型模式,策略模式(15)

usr bin env python coding utf 8 author andy 大話設計模式 設計模式 策略模式 策略模式 strategy 它定義了演算法家族,分別封裝起來,讓他們之間可以相互替換,此模式讓演算法的變化,不會影響到使用演算法的客戶 現金收費抽象類 class cashsup...

行為型模式 策略模式

策略 class salestrategy class strategya public salestrategy class strategyb public salestrategy 策略使用者 class salesman void yell salestrategy m strategy 呼...