天天看點

【譯】Swift World:設計模式--中介者模式

作者:Peng

今天我們讨論一下中介者模式(Mediator)。這次不從抽象定義開始,而是用現實世界中的一個場景來解釋它。在一個團隊裡,有産品經理,開發工程師,品質工程師。當開發完成了某些功能,将代碼送出到倉庫。相關環節人員,像品質工程師和産品經理需要被通知。

  1. ​protocol Collogue {​

  2. ​ var id: String { get }​

  3. ​ func send(message: String)​

  4. ​ func receive(message: String)​

  5. ​}​

  6. ​class Developer: Collogue {​

  7. ​ var id: String​

  8. ​ var qe: QE​

  9. ​ var pm: PM​

  10. ​ init(qe: QE, pm: PM) {​

  11. ​ self.id = "Developer"​

  12. ​ self.qe = qe​

  13. ​ self.pm = pm​

  14. ​ }​

  15. ​ func send(message: String) {​

  16. ​ qe.receive(message: message)​

  17. ​ pm.receive(message: message)​

  18. ​ }​

  19. ​ func receive(message: String) {​

  20. ​ print(message)​

  21. ​ } ​

  22. ​}​

  23. ​class QE: Collogue {​

  24. ​ var id: String​

  25. ​ var developer: Developer​

  26. ​ var pm: PM​

  27. ​ init(developer: Developer, pm: PM) {​

  28. ​ self.id = "QE"​

  29. ​ self.developer = developer​

  30. ​ self.pm = pm​

  31. ​ }​

  32. ​ func send(message: String) {​

  33. ​ developer.receive(message: message)​

  34. ​ pm.receive(message: message)​

  35. ​ }​

  36. ​ func receive(message: String) {​

  37. ​ print(message)​

  38. ​ }​

  39. ​}​

  40. ​class PM: Collogue {​

  41. ​ var id: String​

  42. ​ var developer: Developer​

  43. ​ var qe: QE​

  44. ​ init(developer: Developer, qe: QE) {​

  45. ​ self.id = "PM"​

  46. ​ self.developer = developer​

  47. ​ self.qe = qe​

  48. ​ }​

  49. ​ func send(message: String) {​

  50. ​ developer.receive(message: message)​

  51. ​ qe.receive(message: message)​

  52. ​ }​

  53. ​ func receive(message: String) {​

  54. ​ print(message)​

  55. ​ }​

  56. ​}​

每個角色都需要持有另一個角色的執行個體,這種連接配接方式是高耦合的,且很不容易修改。

【譯】Swift World:設計模式--中介者模式

現在我們需要一個中介者幫助我們簡化這個系統。中介者的目的是幫助對象之間互相交流。它讓每個對象都是跟自己進行互動而不是其他對象。目前對象不需要持有别的對象,而是持有中介者。這樣将解耦系統,它的結構圖如下所示:

【譯】Swift World:設計模式--中介者模式

我們來寫一下代碼:

  1. ​protocol Mediator {​

  2. ​ func send(message: String, sender: Colleague)​

  3. ​}​

  4. ​class TeamMediator: Mediator {​

  5. ​ var colleagues: [Colleague] = []​

  6. ​ func register(colleague: Colleague) {​

  7. ​ colleagues.append(colleague)​

  8. ​ }​

  9. ​ func send(message: String, sender: Colleague) {​

  10. ​ for colleague in colleagues {​

  11. ​ if colleague.id != sender.id {​

  12. ​ colleague.receive(message: message)​

  13. ​ }​

  14. ​ }​

  15. ​ }​

  16. ​}​

通過持有中介者,那幾個角色對象變成了這樣:

  1. ​protocol Colleague {​

  2. ​ var id: String { get }​

  3. ​ var mediator: Mediator { get }​

  4. ​ func send(message: String)​

  5. ​ func receive(message: String)​

  6. ​}​

  7. ​class Developer: Colleague {​

  8. ​ var id: String​

  9. ​ var mediator: Mediator​

  10. ​ init(mediator: Mediator) {​

  11. ​ self.id = "Developer"​

  12. ​ self.mediator = mediator​

  13. ​ }​

  14. ​ func send(message: String) {​

  15. ​ mediator.send(message: message, sender: self)​

  16. ​ }​

  17. ​ func receive(message: String) {​

  18. ​ print("Developer received: " + message)​

  19. ​ }​

  20. ​}​

  21. ​class QE: Colleague {​

  22. ​ var id: String​

  23. ​ var mediator: Mediator​

  24. ​ init(mediator: Mediator) {​

  25. ​ self.id = "QE"​

  26. ​ self.mediator = mediator​

  27. ​ }​

  28. ​ func send(message: String) {​

  29. ​ mediator.send(message: message, sender: self)​

  30. ​ }​

  31. ​ func receive(message: String) {​

  32. ​ print("QE received: " + message)​

  33. ​ }​

  34. ​}​

  35. ​class PM: Colleague {​

  36. ​ var id: String​

  37. ​ var mediator: Mediator​

  38. ​ init(mediator: Mediator) {​

  39. ​ self.id = "PM"​

  40. ​ self.mediator = mediator​

  41. ​ }​

  42. ​ func send(message: String) {​

  43. ​ mediator.send(message: message, sender: self)​

  44. ​ }​

  45. ​ func receive(message: String) {​

  46. ​ print("PM received: " + message)​

  47. ​ }​

  48. ​}​

這樣一來,整個結構就變成了下面這樣:

  1. ​//usage​

  2. ​let mediator = TeamMediator()​

  3. ​let qe = QE(mediator: mediator)​

  4. ​let developer = Developer(mediator: mediator)​

  5. ​let pm = PM(mediator: mediator)​

  6. ​mediator.register(colleague: developer)​

  7. ​mediator.register(colleague: qe)​

  8. ​mediator.register(colleague: pm)​

  9. ​mediator.send(message: "Hello world!", sender: developer)​