Re: [問題] 一個關於 strategy pattern 的疑惑
開宗明義第一句:Stragety 做成 Singleton 不是正解,
不要浪費時間。(後面再來詳解)
首先,Strategy 解決的問題是,把不同情況需要不同的
邏輯,包裝成所謂 Strategy, 然後只要替換 strategy,
就能不影響caller 的 code 之下做到不同的工作。(
很大概的說法)。
回到你的問題,在替換 strategy 究竟需不需要每次生成,
這根本不是 Strategy 涵蓋的範圍。
解決方法可以很多。每次生成當然可以(後面再說怎麼
解決你的擔心),更直接的是,一個 Character 可以存
著自己可用的技能, 所謂替換,就是在手頭可用的技能
拿出對應的來使用而已:
class Character {
AttackStrategy activeAttackStrategy;
List<AttackStrategy> attackStrategies;
void selectStrategy(int index) {
activeAttackStrategy = attackStrategies.get(index);
}
}
或者用類似的想法。簡單而言,要替換,並不代表每次要生成
新的。
然後有些回應提到用 把 strategies 做成singleton。請千萬不要。
在這種情況下99% 不是正解。Singleton 的用意是這 class 在意義上
在整個系統只存在一份,但這些 Strategy 並沒有這樣的需要。更何況,
很多時候一個 strategy 會存有 state, 例如:
class FireballStrategy implements AttackStrategy {
int level = 1;
public void setLevel(int level) {...}
public void attack() {
reduceHpBy(level * 100);
}
}
這樣怎麼可能適合用 singleton 呢?就算你的設計上不存在 state,
概念上你的 strategy 也不是 singleton。
要是你擔心生成太多,解決方法也應該是 Flyweight pattern 而非
Singleton。
至於有一篇回文大概是存個 string 然後每次找 factory 去拿
strategy 再 invoke,個人覺得只是換湯不換藥,再加上上面提
到 strategy 很多時候是有internal state 的,這種解決方法
並不理想。把 factory 弄成 singleton 更是不必要。這可以算是
濫用 singleton 的好例子 :p
(整個討論本身好像和 Java 沒太大關係...)
Alien
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 223.19.42.175
※ 編輯: adrianshum 來自: 223.19.42.175 (06/23 23:11)
※ 編輯: adrianshum 來自: 223.19.42.175 (06/23 23:15)
※ 編輯: adrianshum 來自: 223.19.42.175 (06/23 23:19)
推
06/23 23:42, , 1F
06/23 23:42, 1F
→
06/24 06:24, , 2F
06/24 06:24, 2F
推
06/24 08:10, , 3F
06/24 08:10, 3F
→
06/24 08:22, , 4F
06/24 08:22, 4F
→
06/24 08:24, , 5F
06/24 08:24, 5F
→
06/24 08:49, , 6F
06/24 08:49, 6F
→
06/24 08:53, , 7F
06/24 08:53, 7F
→
06/24 08:56, , 8F
06/24 08:56, 8F
→
06/24 09:07, , 9F
06/24 09:07, 9F
→
06/24 09:08, , 10F
06/24 09:08, 10F
→
06/24 09:10, , 11F
06/24 09:10, 11F
→
06/24 09:11, , 12F
06/24 09:11, 12F
→
06/24 09:13, , 13F
06/24 09:13, 13F
→
06/24 09:14, , 14F
06/24 09:14, 14F
→
06/24 09:15, , 15F
06/24 09:15, 15F
→
06/24 09:16, , 16F
06/24 09:16, 16F
→
06/24 09:16, , 17F
06/24 09:16, 17F
推
06/24 09:21, , 18F
06/24 09:21, 18F
→
06/24 09:36, , 19F
06/24 09:36, 19F
→
06/24 09:38, , 20F
06/24 09:38, 20F
→
06/24 09:41, , 21F
06/24 09:41, 21F
討論串 (同標題文章)
完整討論串 (本文為第 3 之 4 篇):