跟JBPM学设计模式之适配器模式
跟JBPM學設計模式之適配器模式
模式簡介
???????? 適配器模式(Adapter),將一個類的接口轉換成客戶希望的另一個接口。適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
???????? 說起適配器模式,大家一定會想起我們筆記本使用的適配器。插座輸出的電壓是220v,我們的筆記本電腦是不能直接使用的,這個時候就需要一個中介,它可以輸入220v的電壓,然后輸出筆記本電腦所需要的電壓。這個例子中,我們可以將插排輸出的電壓,理解為其對外發布的接口;而筆記本需要的輸入電壓,可以理解為客戶需要的接口;而適配器的工作就是將服務者提供的接口“適配”成客戶需要的接口。
???????? 適配器模式由類的適配器模式和對象的適配器模式兩種不同的形式。
???????? 類的適配器模式將被適配的類的接口轉換成客戶需要的接口,其結構如下圖所示
圖 1-1.類適配器模式
???????? 從圖中可以看到Adaptee類并沒有TargetMethod方法,然而客戶端卻需要這個方法,為了是客戶端可以使用Adaptee類,提供了一個中介即Adapter,其把Adatee和Target類的接口銜接起來。由于Adapter繼承了Adaptee類,這就決定這個是類適配器模式。
???????? 該模式涉及到三種角色:
???????? 目標角色:其實客戶需要的接口,在類適配器模式中,不可以是類。
???????? 源角色:提供服務并需要進行適配接口的類。
???????? 適配器角色:其將源接口轉換成目標接口,顯然其不可能是接口,而必須是一個類。
???????? 對象適配器模式,與類的適配器模式一樣,其也把被適配類的接口轉換成客戶需要的接口,但其不是通過繼承Adaptee實現的,而是通過關聯Adaptee類實現的。對象適配器模式的結構如下圖
圖 1-2.對象適配器模式
???????? 同樣從圖中可以看到,Adaptee類是沒有TargetMethod方法的,但是客戶端是需要這個方法的。為了使客戶端可以使用這個類,則需要提供一個包裝類Adapter,其包裝了一個Adaptee的實例,從而使其可以把Adaptee的接口與Target類的接口銜接起來。Adapter與Adaptee是關聯關系,這決定了該模式是對象適配器模式。
???????? 同樣這個模式中也涉及到三個角色,這與類適配器模式是一樣的,不再贅述。
JBPM中的適配器模式
???????? 適配器模式分為類適配器模式和對象適配器模式,那我們也分別來看jbpm中的實現。
???????? JBPM中的查詢相關的功能使用了類適配器模式,例如歷史任務查詢,具體的結構如下圖所示
圖 1-3 JBPM中的類適配器模式
???????? 該模式涉及到的三種角色如下
???????? 目標角色:HistoryQuery作為目標角色,提供了客戶需要的接口,比如設置查詢參數和獲取查詢結果的方法等。
???????? 源角色:AbstractQuery類作為源角色,其實現了整個的查詢邏輯,最終為客戶提供查詢服務,但是這些并不是客戶所需要的接口。
???????? 適配器角色:HistoryQueryImpl作為適配器角色,它將客戶需要的一些方法最終傳遞給為AbstractQuery來實現。
???????? JBPM中的持久化使用的是Hibernate,其中對hibernate中的Session的封裝使用的是對象適配器模式。具體的結構如下圖所示
圖 1-4 JBPM中的對象適配器模式
???????? 該模式涉及到的角色如下
???????? 目標角色:DbSession作為目標角色,提供了JBPM中需要使用的一些借口,這些借口有的具有一定的業務邏輯,其是hibernate不可能提供的。
???????? 源角色:Session作為源角色,其提供了持久化過程中需要的一些具體的方法。
???????? 適配器角色:DbSessionImpl作為適配器角色,其也是將客戶需要的一些功能傳遞給持有的session對象,最終由session來進行實現。
適配器模式的優勢和劣勢
1.????? 在類適配器模式中,由于適配器類是源角色的子類,所以我們可以輕松的通過重載(override)來置換源角色中的方法;一個適配器只能適配一個類,不能同時適配子類和父類。
2.????? 在對象適配器模式中,同一個適配器可以把源角色及其子類都適配到目標接口;相對類適配器模式,如果想置換源角色的方法相對要難一些;新增加一些方法比較容易,同時也使用與所有的源角色。
總結
以上是生活随笔為你收集整理的跟JBPM学设计模式之适配器模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PLinq Lookup Paralle
- 下一篇: SpringBoot2.0 基础案例(1