設計模式(designer pattern)

撰寫程序常有些看似不合理但是又非得完成的需求。舉個例子說,現在老闆叫你開發一個猜數字遊戲,會隨機產生0-9的數字,用戶輸入的數字與隨機產生的數字相比,如果相同就顯示“猜中了”,如果不同則讓用戶繼續輸入數字,直到猜中爲止。
這程序有什麼難的,相信你現在也可以寫出來:

import java.util.Scanner;

public class Guess{
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int number = (int)(Math.random()*10);
        int guess;
        do{
            System.out.println("輸入數字:");
            guess = Scanner.nextInt();
        }while(guess != number);
        System.out.println("猜中了!");
    }
}

當你將程序交給老闆後,老闆皺着眉頭說:“我有說要在文本模式下執行這個遊戲嗎?”你就問了:“請問會在哪個環境下執行呢?”老闆說:“還沒有決定,也許會用窗口程序,不過改成網頁也不錯,下個星期開會討論一下。”你問:“那可以下個星期討論好了我再來寫嗎?”老闆說:“不行!”你:“……”

這個例子好笑嗎?在團隊合作、多個部門開發程序時,有很多時候,你不能只是爲了等另外一個部門把程序操作出來,也許另外一個部門要3個月才能完成,難道你們這個部門要空轉3個月?有些需求無法確定,卻要撰寫出程序的例子太多了。

其實有些看似不合理的需求,可以通過設計來解決。以上面的例子來說,取得用戶輸入、顯示結果的環境未定,但你負責的這部分還是可以先操作的。例如:

public abstract class GuessGame {
    public void go(){
        int number = (int)(Math.random()*10);
        int guess;
        do {
            print("輸入數字:");
            guess = nextInt();
        }while (guess != number);
        println("猜中了");
    }
    public void println(String text){
        print(text+"\t");
    }

    public abstract void print(String text);
    public abstract int nextInt();
}

這個類的定義不完整,print()、println()與nextInt()都是抽象發放,因爲老闆還沒有決定在哪個環境執行遊戲,所以如何顯示輸出、取得用戶輸入值就不能操作。可以先操作的是猜數字的流程,雖然是抽象方法,但在go()方法中,還是可以調用。

等到下個星期開會決定,還是在文本模式下執行遊戲,你就再撰寫ConsoleGame,繼承抽象類GuessGame,操作當中的抽象方法即可。:

public class ConsoleGame extends GuessGame {
    private Scanner input = new Scanner(System.in);

    @Override
    public void print(String text) {
        System.out.print(text);
    }

    @Override
    public int nextInt() {
        return input.nextInt();
    }

}

實際上創建出ConsoleGame實例,執行go()方法過程中調用到print()、nextInt()或println()等方法時,都是執行ConsoleGame中定義的流程,完整的猜數遊戲就操作出來了。例如:

public class Guess{
    public static void main(String[] args) {
        GuessGame game = new ConsoleGame();
        game.go();
    }

}

一個執行結果如下:

輸入數字:5
輸入數字:4
輸入數字:3
輸入數字:2
猜中了 

設計上的經驗,稱爲設計模式(Design Pattern),如果你對其他設計模式有興趣,歡迎持續查看本博客更新內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章