20211006 多種資料分析 正態分佈 檢驗
阿新 • • 發佈:2021-10-12
策略模式基本介紹
1.策略模式(Strategy Pattern)中,定義演算法簇,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶
2.這演算法體現了幾個設計原則,第一:把變化的程式碼從不變的程式碼中分離出來;第二:針對介面程式設計而不是具體類(定義了策略介面);第三:多用組合/聚合,少用繼承(客戶通過組合方式使用策略)
策略模式原理類圖
從圖中可以看到,客戶context有成員變數strategy或者其他的策略介面,至於使用到哪個策略,可以在構造器中指定
策略模式解決鴨子問題
編寫鴨子專案,要求:
1.有各種鴨子(野鴨,橡皮鴨,水鴨等),鴨子有各種行為(叫、飛行等)
2.顯示鴨子的資訊
public interface FlyBehavior { void fly(); // 子類具體實現 } public class NoFlyBehavior implements FlyBehavior{ @Override public void fly() { System.out.println("不會飛"); } } public class GoodFlyBehavior implements FlyBehavior{ @Override public void fly() { System.out.println("飛得高"); } } public class BadFlyBehavior implements FlyBehavior{ @Override public void fly() { System.out.println("飛的低"); } }
public abstract class Duck { //屬性 策略介面 FlyBehavior flyBehavior; public Duck(){ } public abstract void display();// 顯示鴨子資訊 public void quack(){ System.out.println("鴨子嘎嘎叫"); } public void swim(){ System.out.println("鴨子會游泳"); } public void fly(){ // 改進 if(flyBehavior != null){ flyBehavior.fly(); } } public void setFlyBehavior(FlyBehavior flyBehavior){ this.flyBehavior = flyBehavior; } }
public class ToyDuck extends Duck{
public ToyDuck(){
flyBehavior = new NoFlyBehavior();
}
@Override
public void display() {
System.out.println("玩具鴨");
}
// 需要重寫父類的所有方法
public void quack(){
System.out.println("玩具鴨不能叫");
}
public void swim(){
System.out.println("玩具鴨不會游泳");
}
}
public class WildDuck extends Duck{
// 構造器,傳入FlyBehavior的物件
public WildDuck() {
flyBehavior = new GoodFlyBehavior();
}
@Override
public void display() {
System.out.println("野鴨");
}
}
public class PekingDuck extends Duck{
public PekingDuck(){
flyBehavior = new NoFlyBehavior();
}
@Override
public void display() {
System.out.println("北京鴨");
}
}
public class Client {
public static void main(String[] args) {
WildDuck wildDuck = new WildDuck();
wildDuck.fly();
ToyDuck toyDuck = new ToyDuck();
toyDuck.fly();
PekingDuck pekingDuck = new PekingDuck();
pekingDuck.fly();
// 動態改變某個物件的行為
pekingDuck.setFlyBehavior(new GoodFlyBehavior());
pekingDuck.fly();
}
}
策略模式的注意事項和細節
1.策略模式的關鍵是:分析專案中變化部分與不變部分 2.策略模式的核心思想是:多用組合/聚合 少用繼承;用行為類組合,而不是行為的繼承,更有彈性 3.體現了OCP原則客戶端增加行為不用修改原有程式碼,只要新增一種策略(或者行為)即可,避免了多重轉移(if..else if..else) 4.提供了可以替換繼承關係的辦法:策略模式將演算法封裝在獨立的Strategy類中使得你獨立於其Context改變它, 使它易於切換、易於理解、易於擴充套件 5.需要注意的是:每新增一個策略就要增加一個類,當策略過多會導致類數目龐大