iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0
自我挑戰組

Ruby OOP to Oops !n 30系列 第 19

IT 邦鐵人賽 Day 19-Facade

  • 分享至 

  • xImage
  •  

門面模式(Facade)

目的:

替子系統裡的一堆介面定義一套統一的高階介面,讓子系統更易使用。

結構:

https://ithelp.ithome.com.tw/upload/images/20221004/20151094NYj5sx1sKv.png

左邊是沒有使用門面模式(Facade)的狀況下,讓整個執行程序複雜
有邊是使用門面模式(Facade)的狀況下,只需要通過一個介面就可以使用取的各個物件

class Facade

  def initialize(subsystem1, subsystem2)
    @subsystem1 = subsystem1 || Subsystem1.new
    @subsystem2 = subsystem2 || Subsystem2.new
  end

  def operation
    results = []
    results.append('Facade initializes subsystems:')
    results.append(@subsystem1.operation1)
    results.append(@subsystem2.operation1)
    results.append('Facade orders subsystems to perform the action:')
    results.append(@subsystem1.operation_n)
    results.append(@subsystem2.operation_z)
    results.join("\n")
  end
end


class Subsystem1
  # @return [String]
  def operation1
    'Subsystem1: Ready!'
  end

  def operation_n
    'Subsystem1: Go!'
  end
end


class Subsystem2

  def operation1
    'Subsystem2: Get ready!'
  end

  def operation_z
    'Subsystem2: Fire!'
  end
end


def client_code(facade)
  print facade.operation
end

subsystem1 = Subsystem1.new
subsystem2 = Subsystem2.new
facade = Facade.new(subsystem1, subsystem2)
client_code(facade)

結果

Facade initializes subsystems:
Subsystem1: Ready!
Subsystem2: Get ready!
Facade orders subsystems to perform the action:
Subsystem1: Go!
Subsystem2: Fire!

解釋

若是沒有使用門面模式(Facade),會需要個別取用Subsystem1Subsystem2,而門面模式(Facade)其實很像一個打包的介面,他幫我們把需要的物件整理在這個介面裡,然後可以直接取用,不用自己去拿
當然,並不是每個東西(物件)都要裝進去此介面,而是可以創立不同的門面模式(Facade)來取得較常使用的物件,所以別以為一定要每個東西都裝進門面模式(Facade)的介面之中喔!

文章不定期更新!

感謝大家 如有問題,再煩請大家指教!


上一篇
IT 邦鐵人賽 Day 18-Decorator
下一篇
IT 邦鐵人賽 Day 20-Flyweight
系列文
Ruby OOP to Oops !n 3020
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言