TIL: 把策略從物件裡拆出來
2026-05-14·2 min read·updated 2026-05-14·OOPJavaDesign Patterns
學習把「執行策略」從物件中拆出來,改用組合取代繼承,讓類型更彈性。
今天物件導向課的 mob2,題目是租片系統。 Movie 有三種類型(舊片、新片、兒童片),每種計費方式不同。
第一直覺:繼承
一開始我們讓三個子類別繼承 Movie:
Movie├── RegularMovie├── NewReleaseMovie└── ChildrenMovie可以跑,但有個問題,如果一部電影從「新片」變成「舊片」,就得把整個物件替換掉。繼承讓類型在建立時就固定了。
拆出 MovieType
後來把計費邏輯抽成一個抽象類別 MovieType,讓 Movie 持有它:
java
public abstract class MovieType { public abstract double getCharge(int days); public abstract double getPoints();}public class Movie { private MovieType type; public void setMovieType(MovieType type) { this.type = type; } // getCharge / getPoints 都委託給 type}三種計費策略變成 MovieType 的三個子類別,Movie 本身不再關心計費細節。
差在哪
| 繼承版 | 策略版 | |
|---|---|---|
| 類型變更 | 要換物件 | setMovieType() 一行 |
| 新增類型 | 繼承 Movie,可能影響其他邏輯 | 只加一個 MovieType 子類別 |
| Movie 的職責 | 計費 + 資料 | 只管資料,計費外包 |
Strategy Pattern :把「會變的行為」封裝成獨立物件,讓主物件持有它而不是繼承它。
related_posts
share›