策略模式學習1:
從簡單的模擬鴨子應用做起:
SimUDuck.遊戲中會出現各種鴨子,一邊游泳,一邊呱呱叫。
首先通常的設計,設計一個鴨子超類,所有的鴨子都會呱呱叫,也會游泳,由超類負責處理這部分的行爲實現代碼。
代碼分別如下:
這是一個鴨子超類
public abstract class Duck {
public void quack() {
System.out.println("呱呱叫...");
}
public void swim() {
System.out.println("游來游去...");
}
abstract void display();// 每種鴨子的外觀更不同,所以設定爲抽象的
/*
* 某一天需求變了,某些鴨子要會飛。
* 因此設計想到在超類中加入了這個方法,那麼所有的鴨子都具備了會飛的行爲。
*/
void fly(){
System.out.println("飛來飛去...");
}
//鴨子的其他方法
}
鴨子子類們:
/**
* 綠頭鴨
* @author Administrator
*
*/
public class MallardDuck extends Duck {
@Override
void display() {
System.out.println("綠頭鴨..");
}
}
/**
* 紅頭鴨
* @author Administrator
*
*/
public class RedheadDuck extends Duck {
@Override
void display() {
System.out.println("紅頭鴨...");
}
}
/**
* 橡皮鴨
* @author Administrator
*
*/
public class RubberDuck extends Duck {
@Override
void display() {
System.out.println("橡皮鴨...");
}
/*
* 橡皮鴨子不會呱呱叫
* 但是問題來了,這個橡皮鴨子會飛?
* 那設計人員會說:一樣覆蓋掉就好
*/
@Override
public void quack() {
//覆蓋超類的呱呱叫
System.out.println("吱吱叫...");
}
@Override
void fly() {
//覆蓋,變成什麼事兒都不做
;
}
}
這樣設計就是最通常的設計了,如果需求不變,那這樣設計就沒有什麼缺點了。