設計模式 策略模式

2021-09-29 21:42:23 字數 2729 閱讀 7180

策略模式屬於行為型模式

這裡以乙個例子來進行引入並講解。該例子是乙個鴨子遊戲,遊戲中會出現各種各樣的鴨子,它們會游泳和呱呱叫,這樣我們會發現,它們的共同特徵是游泳和呱呱叫,所以我們可以設計乙個超類,然後其它子類繼承該超類即可。

在這裡我們對超類進行設計時,需要有三個方法,其一是swim(),其二是quack(),其三就是外觀display()了,這裡的外觀是各種各樣的,所以外觀需要是抽象的,這裡給出超類的原始碼

public abstract class duck 

public void swim()

public abstract void display();

}

有了超類,我們就可以設計子類了,如果我們想要設計乙隻綠頭鴨和乙隻紅頭鴨,那麼只需繼承超類即可

public class mallardduck extends duck 

}

public class redheadduck extends duck 

}

這樣看似沒什麼問題,但是,如果有的鴨子不會叫怎麼辦呢,你可能會想,讓不會叫的鴨子重寫quack()方法,如果將來又有鴨子會飛呢,你可能會在超類中加上fly()方法,但是有的鴨子又不會飛,你又要重寫該fly()方法,這裡給出超類和乙個既不會叫也不會飛的子類鴨子

public abstract class duck 

public void fly()

public void swim()

public abstract void display();

}

public class noquacknofly extends duck 

//因為既不會叫也不會飛,所以只能空實現

@override

public void quack()

@override

public void fly()

}

如果後面還有更多的方法是不是都需要重寫一遍,這看似有點麻煩了,所以我們可以將這些非共有的方法進行分離開來,然介面來處理這些方法,有該方法的我們就去實現,沒有的就不用實現了,改完之後的duck(),以及兩個介面如下

public abstract class duck 

public abstract void display();

}

public inte***ce quack
public inte***ce fly
這樣一來,我們再去實現既不會飛也不會叫的鴨子就相對簡單了,如下

public class noquacknofly extends duck 

}

這看似很棒,但是,如果有1024只鴨子,它們都重寫了quack方法,而且都是呱呱叫,如果我們想讓呱呱叫改為吱吱叫,那你是不是要改1024個類,這貌似有點笨拙,所以我們引入了我們的策略模式進行解決

首先我們有乙個超類,也就是duck,裡面有兩個 固定的方法,乙個是游泳,乙個是外觀

public abstract class duck 

public abstract void display();

}

然後是叫和飛的介面

public inte***ce quack
public inte***ce fly
這裡我們用不同方法的類去實現這兩個介面,你會看到神奇的效果的

public class quackimpl implements quack 

}

public class squackimpl implements quack 

}

public class flyimpl implements fly 

}

介面的實現類寫好之後,我們以叫聲來進行測試,我們以綠頭鴨是呱呱叫紅頭鴨是吱吱叫為例,此刻我們修改duck類,新增對叫聲的引用

public abstract class duck 

public void swim()

public abstract void display();

}

然後我們去修改綠頭鴨和紅頭鴨的構造方法,在構造方法中new出叫聲的例項物件,也就構成了,當你呼叫quack()方法時,我們好知道是呼叫的呱呱叫還是吱吱叫

public class mallardduck extends duck 

@override

public void display()

}

public class redheadduck extends duck 

@override

public void display()

}

好了,這裡給出測試類main

public class main 

}

執行結果如下

設計模式 策略設計模式

策略設計模式其實就是多型的使用,父類引用指向子類物件。策略模式的最大特點是使得演算法可以在不影響客戶端的情況下發生變化,從而改變不同的功能。策略模式的缺點其實也很明顯,在於策略模式把每一種具體的策略都封裝成乙個實現類,如果策略有很多的話,很顯然是實現類就會導致過多,顯得臃腫。案列 author de...

設計模式 策略模式

策略模式是一種定義一系列演算法的方法,從概念上來看,所有這些方法完成的都是相同的工作,只是實現不同,他們可以用相同的方式呼叫所有的演算法,減少了演算法類和使用演算法類之間的耦合.優點 策略模式的strategy類層次為context定義了一系列可供重用的演算法和行為,繼承有助於吸取這些演算法中的公共...

設計模式 策略模式

定義了演算法家族,分別封裝起來,讓他們之間可以相互替代,此模式讓演算法的變化,不會影響到使用演算法的客戶端 定義抽象類 分別實現抽象類,不同的物件 然後用乙個類初始化,並傳入具體的策略物件 根據具體的策略物件,呼叫其演算法的方法 客戶端 是由於例項化不同的策略,所以最終在呼叫 類時,所獲得的結果時不...