《大話設(shè)計(jì)模式》閱讀筆記和總結(jié)苇侵。原書是C#編寫的全庸,本人用Java實(shí)現(xiàn)了一遍,包括每種設(shè)計(jì)模式的UML圖實(shí)現(xiàn)和示例代碼實(shí)現(xiàn)奠蹬。
目錄:設(shè)計(jì)模式
Github地址:DesignPattern
說明
定義:策略模式(Strategy)它定義了算法家族哮笆,分別封裝起來来颤,讓它們之間可以互相替換,此模式讓算法的變化稠肘,不會影響到使用算法的客戶福铅。
UML圖:
策略模式UML圖.png
代碼實(shí)現(xiàn):
Strategy類,定義所有支持的算法的公共接口
abstract class Strategy{
//算法方法
public abstract void AlgorithmInterface();
}
ConcreteStrategy,封裝了具體的算法或行為
class ConcreteStrategyA extends Strategy{
@Override
public void AlgorithmInterface() {
System.out.println("算法A實(shí)現(xiàn)");
}
}
class ConcreteStrategyB extends Strategy{
@Override
public void AlgorithmInterface() {
System.out.println("算法B實(shí)現(xiàn)");
}
}
class ConcreteStrategyC extends Strategy{
@Override
public void AlgorithmInterface() {
System.out.println("算法C實(shí)現(xiàn)");
}
}
Context项阴,用一個ConcreteStrategy來配置滑黔,維護(hù)一個對Strategy對象的引用
class Context{
Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
// 上下文接口
public void ContextInterface(){
strategy.AlgorithmInterface();
}
}
客戶端代碼
public class StrategyPattern {
public static void main(String[] args){
Context context;
context = new Context(new ConcreteStrategyA());
context.ContextInterface();
context = new Context(new ConcreteStrategyB());
context.ContextInterface();
context = new Context(new ConcreteStrategyC());
context.ContextInterface();
}
}
運(yùn)行結(jié)果
算法A實(shí)現(xiàn)
算法B實(shí)現(xiàn)
算法C實(shí)現(xiàn)
示例
例子:商場在賣衣服的時候有時候會采取促銷手段,有的會原價出售环揽,有的會打折略荡,有的會滿減。用程序模擬這個過程歉胶,計(jì)算最終的費(fèi)用汛兜。
UML圖:
策略模式示例UML圖.png
代碼:
現(xiàn)金收費(fèi)抽象類
public abstract class CashSuper {
/**
* 現(xiàn)金收取超類方法,傳入原價通今,返回當(dāng)前價
*/
public abstract double acceptCash(double money);
}
正常收費(fèi)子類
public class CashNormal extends CashSuper {
@Override
public double acceptCash(double money) {
// 正常收費(fèi)粥谬,返回原價
return money;
}
}
打折收費(fèi)子類
public class CashRebate extends CashSuper {
private double moneyRebate = 1;
public CashRebate(double moneyRebate){
this.moneyRebate = moneyRebate;
}
@Override
public double acceptCash(double money) {
// 正常收費(fèi)肛根,返回原價
return money*moneyRebate;
}
}
滿減收費(fèi)子類
public class CashReturn extends CashSuper {
private double moneyCondition = 0;// 滿足的條件
private double moneyReturn = 0;//返利
public CashReturn(double moneyCondition,double moneyReturn){
this.moneyCondition = moneyCondition;
this.moneyReturn = moneyReturn;
}
@Override
public double acceptCash(double money) {
double result = money;
if (money>=moneyCondition){
result = money - Math.floor(money/moneyCondition)*moneyReturn;
}
return result;
}
}
CashContext類
public class CashContext {
private CashSuper cs;
public CashContext(CashSuper cs){
this.cs = cs;
}
public double GetResult(double money){
return cs.acceptCash(money);
}
}
客戶端代碼
public class Main {
public static void main(String[] args){
String type = "滿300減100";
CashContext cc = null;
switch (type){
case "正常收費(fèi)":
cc = new CashContext(new CashNormal());
break;
case "滿300減100":
cc = new CashContext(new CashReturn(300,100));
break;
case "打8折":
cc = new CashContext(new CashRebate(0.8));
break;
}
double resultPrice = cc.GetResult(520);
System.out.println("最終的價格是:"+resultPrice);
}
}
運(yùn)行結(jié)果
最終的價格是:420.0