定義一組演算法,將每個演算法都封裝起來,使它們之間可以互換。
策略模式和**模式差別就是策略模式的封裝角色和被封裝的策略類不用是同乙個介面。如果是同乙個介面那就是**模式了。
一、趙雲使用三個錦囊
1. 妙計介面
public inte***ce istrategy
2. 喬國老開後門
public class backdoor implements istrategy
}
3. 吳國太開綠燈
public class givengreenlight implements istrategy
}
4. 孫夫人斷後
public class blockenemy implements istrategy
}
5. 錦囊
public class context
//使用計謀了,看我出招了
public void operate()
}
6. 使用計謀
public class zhaoyun
}
二、策略模式的定義
定義一組演算法,將每個演算法都封裝起來,使它們之間可以互換。
策略模式和**模式差別就是策略模式的封裝角色和被封裝的策略類不用是同乙個介面。如果是同乙個介面那就是**模式了。
1. 抽象的策略角色
public inte***ce strategy
2. 具體策略角色
public class concretestrategy1 implements strategy
}
&
public class concretestrategy2 implements strategy
}
3. 封裝角色
public class context
//封裝後的策略方法
public void doanythinig()
}
4. 高層模組
public class client
}
三、策略模式的應用
1. 優點
1)保證對外提供「可自由切換「的策略。
2)避免使用多重條件判斷
3)擴充套件性良好
2. 缺點
1)策略類數量增多,每乙個策略都是乙個類,復用性很小。
2)上層模組必須知道有哪些策略,然後才能決定使用哪乙個策略。所以策略模式可以工廠方法模式、**模式和享元模式
3. 使用場景
1)多個類只有在演算法或行為上稍有不同的場景
2)演算法需要自由切換的場景
3)需要遮蔽演算法 規則的場景
4. 注意
如果具體策略數量超過4個,則需要考慮使用混合模式,解決策略類膨脹和對外暴露的問題。
四、擴充套件
輸入int的a、b,然後輸入string的"+"或"-",計算出結果
這裡"+"或"-"就可以看成乙個策略
------------------------------擴充套件1 : 普通策略-----------------------------------
1. 引入策略模式
public inte***ce calculator
2. 上下文
public class add implements calculator
}
&
public class sub implements calculator
}
3. 上下文
public class context
public int exec(int a,int b,string symbol)
}
4. 場景類
public class client else if(symbol.equals(sub_symbol))
system.out.println("執行結果為:"+a+symbol+b+"="+context.exec(a, b, symbol));
}}
------------------------------擴充套件2 : 列舉策略-----------------------------------
1. 策略列舉
public enum calculator
}, //減法運算
sub("-")
}; string value = "";
//定義成員值型別
private calculator(string value)
//獲得列舉成員的值
public string getvalue()
//宣告乙個抽象函式
public abstract int exec(int a,int b);
}
2. 場景類
public class client
}
GOF 24種設計模式 策略模式
description 抽象策略類 定義了乙個公共介面,各種不同的演算法以不同的方式實現這個介面,context使用這個介面呼叫不同的演算法,一般使用介面或抽象類實現 author jackson public inte ce strategy package org.jackson.gof.pat...
24種設計模式學習筆記之策略模式
策略模式 strategy 行為型設計模式 定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。cashsuper 收費計算策略抽象類正常收費類 正常收費。acceptcash 辦法 直接返回金額 打折收費類 需要在構造器中初始化打折引數 在ac...
24種設計模式
那我們總結一下模板方法模式 模板方法模式就是在模板方法中按照乙個的規則和順序呼叫基本方法,具體到我們上面那個例子就是run方法按照規定的順序 先呼叫start,然後再呼叫engineboom,再呼叫alarm,最後呼叫stop 呼叫本類的其他方法,並且由isalarm方法的返回值確定run中的執行順...