此文為《Head First 設(shè)計模式》章節(jié)1讀書筆記。文中的編程實例為仿照書中示例編寫的窒舟,感覺邏輯上稍有欠缺,但是整體上體現(xiàn)了策略模式的核心思想:動態(tài)應(yīng)對需求變更。待日后遇到更恰當(dāng)?shù)睦釉僮龈摹?/p>
OO基本特性
- 抽象
- 封裝
- 繼承
- 多態(tài)
OO設(shè)計原則
- 封裝變化:獨立出應(yīng)用中可能會變化的部分屿衅;
- 多用組合,少用繼承莹弊;
- 針對超類型(SuperType)進(jìn)行編程涤久,而不是針對實現(xiàn)編程。
OO設(shè)計模式
策略模式
定義算法族忍弛,并將其分別封裝起來响迂,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶细疚。
“繼承”機(jī)制只適用于所有子類都具有和父類同樣行為(共性行為)的情況蔗彤,所以當(dāng)某些子類不具有共性行為時,應(yīng)該將之前是共性的行為從父類和所有子類中剔除(不能直接將共性行為聲明為接口,讓具有該行為的子類實現(xiàn) -> 代碼不能重用幕与,造成代碼重復(fù))挑势,將共性行為抽象成接口(行為接口),并建立一組新類來代表每個具體行為類(行為子類)啦鸣,而原來的父類就可以將行為“委托”給行為子類處理(需要在父類中先聲明行為接口類型的變量潮饱,調(diào)用共性行為方法,再在繼承自父類的子類中用具體的行為子類進(jìn)行賦值)诫给。
示例
package me.yobol.designpattern.strategy;
/**
* 行為接口
*/
public interface SpeakBehavior {
public void speak();
}
package me.yobol.designpattern.strategy;
/**
* 實現(xiàn)行為接口SpeakBehavior的具體行為類
*/
public class Speak implements SpeakBehavior {
@Override
public void speak() {
System.out.println("I can speak commonly!");
}
}
package me.yobol.designpattern.strategy;
/**
* 實現(xiàn)行為接口SpeakBehavior的具體行為類
*/
public class Mute implements SpeakBehavior {
@Override
public void speak() {
System.out.println("Wu la wu la...");
}
}
package me.yobol.designpattern.strategy;
/**
* 行為接口
*/
public interface WalkBehavior {
public void walk();
}
package me.yobol.designpattern.strategy;
/**
* 實現(xiàn)行為接口WalkBehavior的具體行為類
*/
public class Walk implements WalkBehavior {
@Override
public void walk() {
System.out.println("I can walk commonly!");
}
}
package me.yobol.designpattern.strategy;
/**
* 實現(xiàn)行為接口WalkBehavior的具體行為類
*/
public class WalkWithStick implements WalkBehavior {
@Override
public void walk() {
System.out.println("My beg hurt,so I walk with sticks");
}
}
package me.yobol.designpattern.strategy;
/**
* 父類
*/
public abstract class Person {
public SpeakBehavior speakBehavior;
public WalkBehavior walkBehavior;
public void setSpeakBehavior(SpeakBehavior speakBehavior){
this.speakBehavior = speakBehavior;
}
public void setWalkBehavior(WalkBehavior walkBehavior){
this.walkBehavior = walkBehavior;
}
public abstract void represent();
public void performSpeak(){
speakBehavior.speak();
}
public void performWalk(){
walkBehavior.walk();
}
}
package me.yobol.designpattern.strategy;
/**
* 繼承自父類Person的子類
*/
public class CommonPerson extends Person {
public CommonPerson() {
this.speakBehavior = new Speak();
this.walkBehavior = new Walk();
}
@Override
public void represent() {
System.out.println("I am so ugly!");
}
}
package me.yobol.designpattern.strategy;
public class Main {
public static void main(String[] args) {
Person p = new CommonPerson();
p.performSpeak();
p.performWalk();
p.setWalkBehavior(new WalkWithStick());
p.performWalk();
}
}