YUUNJIEE.COM
til-strategy-pattern.md
[_][□][✕]
📄til-strategy-pattern.md×
blog/til-strategy-pattern.md

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 :把「會變的行為」封裝成獨立物件,讓主物件持有它而不是繼承它。

share
ONLINE·yuun@blog·v2.7.0