針對下面類別圖撰寫 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(); } }
沒有留言:
張貼留言