2015年8月6日 星期四

Java上課練習:抽象&介面

針對抽象的介面來寫程式 (抽象類別 與 介面 皆可)

針對下面類別圖撰寫 code


玩家可以更換武器,所以將 武器 作成 介面,和玩家組合(給玩家拿武器),後面可以隨時更換不同的武器
interface Weapon { //設計一把 武器(抽象介面)
    void attack(); //mothod
}

class player { //玩家

    Weapon w; //欄位

    public void attack() { //mothod
        w.attack(); 
    }

}

class 屠龍刀 implements Weapon { //實作武器,繼承Weapon

    @Override
    public void attack() { //覆寫攻擊方式
        System.out.println("屠龍刀攻擊");
    }
}

class 倚天劍 implements Weapon { //實作武器,繼承Weapon

    @Override
    public void attack() { //覆寫攻擊方式
        System.out.println("倚天劍攻擊");
    }
}

class 黃飛鴻 implements Weapon { //實作武器,繼承Weapon

    @Override
    public void attack() { //覆寫攻擊方式
        System.out.println("無影腳");
    }
}

public class PlayerTest {

    public static void main(String[] args) {
        player p1=new player(); //p1(遙控器)是一個玩家
        p1.w=new 黃飛鴻(); //p1的武器是黃飛鴻,可隨時更換武器
        p1.attack(); 

    }
}

撰寫程式需要進行 策略設計模式 ( Strategy Pattern )

  • Player 有一個 (HAS-A) Weapon,是一種組合的概念
  • 程式碼要能重用,可透過繼承 與 組合
  • Java 類別僅能單一繼承,組合比繼承更有彈性
  • 繼承,強調 是一種 (IS-A) 的關係(父類別有ㄧ個子類別)
  • 組合,強調 有一個 (HAS-A) 的關係(類別中有什麼類別)

方法委派
重構 Player 程式碼
interface Weapon { //設計一把 武器(抽象介面)

    void attack(); //mothod
}

class player { //玩家

    private Weapon w; //封裝欄位,有一個HAS-A

    //建構子
    public player(Weapon w) {
        this.w = w;
    }

    //getter
    public Weapon getW() {
        return w;
    }

    //setter
    public void setW(Weapon w) {
        this.w = w;
    }

    public void attack() { //mothod
//        w.attack(); //若玩家手上沒有武器會出現錯誤,所以要加入判斷
        if (w != null) { //判斷有沒有設計拿武器
            w.attack();//委派武器進行攻擊
        }

    }

}

class 屠龍刀 implements Weapon { //實作武器,繼承Weapon

    @Override
    public void attack() { //覆寫攻擊方式
        System.out.println("屠龍刀攻擊");
    }
}

class 倚天劍 implements Weapon { //實作武器,繼承Weapon

    @Override
    public void attack() { //覆寫攻擊方式
        System.out.println("倚天劍攻擊");
    }
}

class 黃飛鴻 implements Weapon { //實作武器,繼承Weapon

    @Override
    public void attack() { //覆寫攻擊方式
        System.out.println("無影腳");
    }
}

public class PlayerTest {

    public static void main(String[] args) {
        player p1 = new player(new 黃飛鴻());
        p1.attack();

        System.out.println("");

        p1.setW(new 倚天劍());//將武器改為拿倚天劍
        p1.attack();
    }
}



沒有留言:

張貼留言