設計模式入門

最近想學設計模式,網上說 HeadFirst 設計模式書挺好的,我來此再鞏固一篇。

故事是這樣的:小明是一個剛畢業的小伙子,他來到了一個遊戲公司實習,項目經理分配了一個實習任務給小明:

設計一個遊戲角色,角色屬性包括(攻擊力,防禦力,敏捷度…等等),以及兩個召喚師技能(閃現和引燃)。

小明想這麼簡單的嗎,如是他用了一天的時間寫好了如下代碼

public class GameRole {
    
    private int atk; // 攻擊力
    private int def; // 防禦力
    private int dex; // 敏捷度
    
    public void flash_move() {
        System.out.println("指定方向瞬移一段距離");
    }
    
    public void ignite() {
        System.out.println("使其處於燃燒狀態 5 s");
    }
}

項目經理看到小明這麼快就完成了任務,表揚了一下小明,小明心裏樂開了花。然後項目經理又布置了一項任務給小明:
再設計兩個角色,他們的召喚師技能分別為(閃現,治療),(閃現,傳送)。

小明心想這難不倒我,然後他仍然只花了一天的時間就寫好了如下代碼:

public class GameRole {
    
    private int atk; // 攻擊力
    private int def; // 防禦力
    private int dex; // 敏捷度
    
    public void flash_move() {
        System.out.println("指定方向瞬移一段距離");
    }
    
    public void ignite() {
        System.out.println("使附近100碼內隊友恢復30%的血量");
    }
}

public class GameRole {
    
    private int atk; // 攻擊力
    private int def; // 防禦力
    private int dex; // 敏捷度
    
    public void flash_move() {
        System.out.println("指定方向瞬移一段距離");
    }
    
    public void ignite() {
        System.out.println("傳送至己方非英雄單位位置處");
    }
}

小明興高采烈的跑去給項目經理看了,項目經理看到小明過來了,心裏覺得這小伙子不錯麻,這麼快就做完了。

然後項目經理便看了他的代碼,這不看不要緊,一看便指着小明罵道:你真是一個糟糕的程序員!!!然後便讓小明改代碼去了。

小明此時還不太明白,我功能都實現了啊,沒啥毛病阿,然後小明不明所以的便問了辦公室的職員,職員告訴他,你代碼冗餘度太高了。

小明一看發現果然如此,然後便花了一天的時間改成如下代碼:

public abstract class GameRole {
    
    private int atk; // 攻擊力
    private int def; // 防禦力
    private int dex; // 敏捷度
  
  // 省略 Getter and Setter method
public void flash_move() { System.out.println("指定方向瞬移一段距離"); } public abstract void skill(); }
public class Role_One extends GameRole { @Override public void skill() { // TODO Auto-generated method stub System.out.println("使其處於燃燒狀態 5 s"); } }
public class Role_Two extends GameRole { @Override public void skill() { // TODO Auto-generated method stub System.out.println("使附近100碼內隊友恢復30%的血量"); } }
public class Role_Three extends GameRole { @Override public void skill() { // TODO Auto-generated method stub System.out.println("傳送至己方非英雄單位位置處"); } }

這次小明覺得冗餘度確實降低了,然後便給項目經理看,項目經理看后覺得確實還行,便又分配了一個任務:
(遊戲用戶希望能自由選擇召喚師技能就好了),所以任務是召喚師技能任意搭配。

小明心想:我寫的這種代碼似乎不用改耶,可以交差了,於是小明便偷懶了两天,然後便上報給項目經理了。

項目經理一看,這代碼沒有變化啊,便問小明,你代碼就這?小明回答是的,然後小明又被罵的狗血淋頭。

不明所以的小明又去問問辦公室的職員,你仔細想想,如果有100個(閃現,引燃),100個(閃現,治療),100個(傳送,治療)呢?

小明突然恍然大悟,那還是有好高的冗餘度啊,經過三天思考後,小明想出了最終答案:

public abstract class GameRole {
private int atk; // 攻擊力 private int def; // 防禦力 private int dex; // 敏捷度 private Skills skill_One; private Skills skill_Two;
  // 省略 Getter and Setter method
} public class Role_Demo extends GameRole { }
public interface Skills {
    public void skill();
}

public class Flush_Move implements Skills {
    @Override
    public void skill() {
        // TODO Auto-generated method stub
        System.out.println("指定方向瞬移一段距離");
    }
}

public class Ignite implements Skills {
    @Override
    public void skill() {
        // TODO Auto-generated method stub
        System.out.println("使其處於燃燒狀態 5 s");
    }
}

public class Treat implements Skills {

    @Override
    public void skill() {
        // TODO Auto-generated method stub
        System.out.println("使附近100碼內隊友恢復30%的血量");
    }
}
public class Main {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Role_Demo role = new Role_Demo();
        role.setSkill_One(new Flush_Move());
        role.setSkill_Two(new Ignite());
        role.getSkill_One().skill();
        role.getSkill_Two().skill();
    }
}

小明寫完了,這次小明怕又被罵,便去問問職員小花了,小花說寫的不錯嗎,於是小明膽戰心驚的去交差了。

項目經理看到小明過來,看着小明的囧樣,內心是想笑的,然後看了看代碼發現這回沒啥問題了,便放心的交給它最後一個任務:

給每個英雄添加四個不相同的技能:

小明經過幾次寫代碼的經歷后,一天便寫出來了:

public abstract class GameRole {
    private int atk; // 攻擊力
    private int def; // 防禦力
    private int dex; // 敏捷度
    private Skills skill_One;
    private Skills skill_Two;
    
    // 省略 Getter and Setter method
    
    public abstract void Skill_One();
    public abstract void Skill_Two();
    public abstract void Skill_Three();
    public abstract void Skill_Four();
}

public class Role_Demo extends GameRole {

    @Override
    public void Skill_One() {
        // TODO Auto-generated method stub
    }

    @Override
    public void Skill_Two() {
        // TODO Auto-generated method stub    
    }

    @Override
    public void Skill_Three() {
        // TODO Auto-generated method stub    
    }

    @Override
    public void Skill_Four() {
        // TODO Auto-generated method stub    
    }
}

經過這幾次任務,小明感覺寫的代碼更漂亮,更優雅了,腰也不酸了,背也不疼了。小明上交任務后,項目經理也露出了滿意的笑容!

最後,小明成功通過了實習,然而項目經理給他分配了下一項任務……

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

※回頭車貨運收費標準