本人所學設計模式皆出自於 結城浩先生的《圖解設計模式》。
Adapter模式也被成爲Wrapper模式
類圖
類適配器模式
對象適配器模式
爲什麼使用Adapter模式
當現有的類已經被充分測試過,bug很少,而且已經被用於其他軟件之中,我們更願意對這些類作爲組件重複利用,Adapter模式會對現有的類進行適配,生成新的類。通過該模式我們可以方便的創建我們需要的方法羣,當出現bug時,由於我們很明確bug不是現有的類,所以只需要調查Adapter即可,代碼問題排查也會非常簡單。
舉例代碼
類適配器
package com.qiang.model;
/**
* 已經存在的人類
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public class Person {
protected void singing() {
System.out.print("singing");
}
protected void dancing() {
System.out.print("dancing");
}
}
package com.qiang.demand;
/**
* 需求接口
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public interface Human {
/**
* 唱歌和跳舞
*/
void singingAndDancing();
/**
* 跳舞和唱歌
*/
void dancingAndSinging();
}
package com.qiang;
import com.qiang.demand.Human;
import com.qiang.model.Person;
/**
* 適配器
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public class Adapter extends Person implements Human {
@Override
public void singingAndDancing() {
singing();
System.out.println(" And Dancing");
}
@Override
public void dancingAndSinging() {
dancing();
System.out.println(" And Singing");
}
}
package com.qiang;
import com.qiang.demand.Human;
/**
* 測試
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public class Test {
public static void main(String[] args) {
Human human = new Adapter();
human.dancingAndSinging();
human.singingAndDancing();
}
}
結果
dancing And Singing
singing And Dancing
對象適配器
package com.qiang.demand;
/**
* 需求
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public abstract class AbstractHuman {
/**
* 唱歌和跳舞
*/
public abstract void singingAndDancing();
/**
* 跳舞和唱歌
*/
public abstract void dancingAndSinging();
}
package com.qiang.model;
/**
* 已經存在的人類
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public class Person {
public void singing() {
System.out.print("singing");
}
public void dancing() {
System.out.print("dancing");
}
}
package com.qiang;
import com.qiang.demand.AbstractHuman;
import com.qiang.model.Person;
/**
* 適配器
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public class Adapter extends AbstractHuman {
private Person person;
public Adapter() {
this.person = new Person();
}
@Override
public void singingAndDancing() {
person.singing();
System.out.println(" And Dancing");
}
@Override
public void dancingAndSinging() {
person.dancing();
System.out.println(" and Singing");
}
}
package com.qiang;
import com.qiang.demand.AbstractHuman;
/**
* 測試
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public class Test {
public static void main(String[] args) {
AbstractHuman human = new Adapter();
human.singingAndDancing();
human.dancingAndSinging();
}
}
結果
singing And Dancing
dancing and Singing
我通過2種方式對Person類到Human/AbstractHuman類進行了適配或者說包裝,在通過調用已存在的類完成新需求的情況下並沒有對原有的類進行修改,通過這種方式完成了代碼的複用,更安全,並且有效減少bug量及代碼冗餘。