Java設計模式--適配器模式
阿新 • • 發佈:2017-11-12
obj implement tar ron 關系 col 而是 target blog
適配器模式:把一個類的接口變成客戶端所期待的另一種接口,使原本因接口不匹配而不能一起工作的兩個類能夠一起工作。
適配器有兩種形式:類的適配器和對象的適配器。
類的適配器模式
結構圖:
可以看出,Adaptee並沒有operateB,而客戶端期待這個方法。為了讓客戶端能使用Adaptee類,增加了一個中間環節,即類Adapter,把Adaptee的API和Target類的API銜接起來。Adapter和Adaptee是繼承關系,這決定了這個適配器模式是類的。
角色:
目標角色:所期待得到的接口--Target
源角色:現需要適配的接口--Adaptee
適配器角色:適配器把源接口轉換成目標接口
package com.design.adapter.classadapter; public interface Target { void operateA(); void operateB(); }
Adaptee
package com.design.adapter.classadapter; public class Adaptee { public void operateA(){ } }
Adapter
package com.design.adapter.classadapter; public class Adapter extendsAdaptee implements Target { @Override public void operateB() { } }
對象的適配器模式
結構圖:
與類的適配器模式不同的是,對象的適配器模式不是使用繼承關系連接到Adaptee類,而是使用委派關系連接到Adaptee類。
Adaptee中沒有operateB方法,而客戶端期待這個方法。為了使客戶端能夠使用Adaptee類,需要一個適配器類。這個適配器類包裝了一個Adaptee的實例,從而使Adaptee的API能夠和Target的API連接起來。Adaptee和Adapter類是為委派關系,決定了這個適配器模式是對象的。
Target
package com.design.adapter.objectadapter; public interface Target { void operateA(); void operateB(); }
Adaptee
package com.design.adapter.objectadapter; public class Adaptee { public void operateA(){ } }
Adapter
package com.design.adapter.objectadapter; public class Adapter implements Target { private Adaptee adaptee; public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } /** * 源類有A方法,所以直接委派即可 */ @Override public void operateA() { adaptee.operateA(); } /** * 源類沒有此方法,需要適配器實現 */ @Override public void operateB() { } }
說明
適配器模式的用意是將接口不同而功能相近的兩個接口加以轉換,在這裏包括了適配器角色補充了一個源角色咩有的方法。不要誤以為適配器模式就是為了補充源角色沒有的方法而準備的。
Java設計模式--適配器模式