本文通過完整、可運行的 PHP 代碼,演示 解析器、策略、觀察者、訪問者、命令 五大經典行為型設計模式的核心結構與典型應用場景。
構建 InterpreterContext 存儲變量值,Expression 抽象類定義 interpret(),具體類包括:
LiteralExpression:字面量VariableExpression:變量OperatorExpression 及子類 EqualsExpression、BooleanOrExpression、BooleanAndExpression:運算符應用:構建 $input equals "4" or $input equals "four" 邏輯,動態賦值變量後反覆解析,輸出判斷結果。
Question 為上下文,聚合 Marker 策略介面。三種評分策略:
MarkLogicMarker:模擬邏輯引擎MatchMarker:精確匹配RegexpMarker:正則匹配客戶端遍歷策略列表,同一題目不同策略得出不同結果,完美體現「定義算法族、封裝各自、使其可互換」。
問題:Login 類硬編碼依賴 Logger、Notifier,擴展需修改核心代碼。
解決:引入 Observable、Observer 介面,Login 維護觀察者列表,notify() 統一分發。
進階:引入 LoginObserver 抽象類,構造函數自動註冊,doUpdate(Login $login) 類型安全,消除向下轉型風險。三種觀察者:SecurityMonitor(失敗郵件)、GeneralLogger(日誌)、PartnershipTool(IP 白名單 Cookie)。
軍隊單元樹:Unit(葉子)、CompositeUnit(容器)、Army/TroopCarrier(具體容器)。
ArmyVisitor 定義 visitXxx() 系列方法,Unit::accept() 雙分發調用。
具體訪問者 TextDumpArmyVisitor 遍歷樹輸出縮進文本報表。新增操作(如統計火力、序列化)只需新增 Visitor,不動單元類。
Command 抽象類定義 execute(CommandContext)。
CommandFactory 根據 action 參數動態載入 {Action}Command.php(如 LoginCommand)。
Controller 持有 CommandContext(封裝 $_REQUEST),調用 factory->getCommand() 獲取命令並執行。
優勢:控制器無需知道具體業務邏輯,新增功能只需新增 Command 類,符合開閉原則。
五大模式代碼均可直接複製運行,建議在 IDE 中逐行調試,體會「雙分發」、「策略熱插拔」、「觀察者自動註冊」等精妙設計。