一.概念
適配器模式 把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口原因不匹配而無法一起工作的兩個類能夠一起工作。適配類可以根據參數返還一個合適的實例給客戶端。 適配器可以分爲兩類,一類是類的適配器模式(採用繼承實現),一類是對象適配器(採用對象組合方式實現)。
二.舉例子
假設現在在都市裏有人物,交通工具。我們抽象出交通工具這個接口,然後有摩托車和汽車兩個交通工具。當人來到草原上時,不僅可以用原來的交通工具,還可以用馬、牛作爲交通工具。但是一開始設計的時候馬和牛隻是一般的動物設計,那麼這個時候得設計一個適配器了。
/**
* 將一個類的接口,轉換成客戶期望的另一個接口。適配器讓原本接口不兼容的類可以合作無間。
* 應用場景
* 在以下各種情況下使用適配器模式:
* 1.系統需要使用現有的類,而此類的接口不符合系統的需要。
* 2.想要建立一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作。這些源類不一定有很複雜的接口。
* 3.(對"對象適配器"而言)在設計裏,需要改變多個已有子類的接口,如果使用類的適配器模式,就要針對每一個子類做一個適配器,而這不太實際。
*/
public class AdapterTest {
//公交工具接口
public interface Riding {
public void ride();
}
public class MotorBike implements Riding {
@Override
public void ride() {
System.out.println("摩托車被騎了。。。");
}
}
public class Car implements Riding {
@Override
public void ride() {
System.out.println("小汽車被開了。。。");
}
}
public class People {
private Riding riding;
public void setRiding(Riding riding) {
this.riding = riding;
}
public void show() {
if(null == this.riding) {
System.out.println("沒有坐騎");
}else {
this.riding.ride();
}
}
}
//動物接口
public interface Animal {
public void run();
}
public class Horse implements Animal {
@Override
public void run() {
System.out.println("馬兒跑啊跑啊。。");
}
}
public class Cattle implements Animal {
@Override
public void run() {
System.out.println("牛兒走呀走呀。。");
}
}
//類適配器,需要單獨給一個類馬和牛做一個適配器,當類很多的時候,類適配器就不實用了。ps:實際開發中很少用
public class RidingAdatperHorseClass extends Horse implements Riding {
@Override
public void ride() {
super.run();
}
}
//對象適配器
public class RidingAdapterAnimal implements Riding {
private Animal animal;
public RidingAdapterAnimal(Animal animal) {
this.animal = animal;
}
@Override
public void ride() {
this.animal.run();
}
}
public static void main(String[] args) {
People people = new AdapterTest().new People();
people.setRiding(new AdapterTest().new MotorBike());
people.show();
people.setRiding(new AdapterTest().new Car());
people.show();
//使用類適配器
people.setRiding(new AdapterTest().new RidingAdatperHorseClass());
people.show();
//使用對象適配器
Horse horse = new AdapterTest().new Horse();
people.setRiding(new AdapterTest().new RidingAdapterAnimal(horse));
people.show();
Cattle cattle = new AdapterTest().new Cattle();
people.setRiding(new AdapterTest().new RidingAdapterAnimal(cattle));
people.show();
}
}
運行結果:
三.總結
當我們一開始設計好的一些類不具有現在客戶端所需要實現的內容的時候,我們可以使用適配器使他適應。實際開發中儘可能少類。當一類羣體有功能抽象類或者接口的時候就可以選擇用對象適配器。
更多參考