设计模式之适配器模式

  适配器模式就是把一个类的接口变换成客户端期望的接口,从而使因接口不匹配无法工作的两类可以在一起工作。

现实场景

  笔记本电源是三向电源插头,但是遇到了电源插座却是两向的,这是就需要一个适配器排插。

适配器模式设计的角色:

  • 源角色(Adaptee):现在需要适配的接口,如上面的两向电源插口;
  • 目标角色(Target):目标角色,也就是所期待得到的接口,如上面的笔记本的三向电源插头;
  • 适配器角色(Adapter):适配器类是本模式的核心。适配器把源接口转换成目标接口,显然,这一角色不可以是接口,而必须是具体类;如上面的排插。

适配器模式实现方法

  类适配器模式和对象适配器模式

类模式适配器

/**
 * Adaptee 源角色 如例子中的双向插口*/
public class Adaptee {
    public void charge(){
        System.out.println("插入两向插头,给你充电了......");
    }
}
/**
 * Target 目标角色 如例子中的三向插口*/
public interface Target {
    void charge();
}
/**
 * Adapter 对象适配器 如例子中的插排*/
public class Adapter extends Adaptee implements Target{
    @Override
    public void charge() {
        super.charge();
    }
}
/**
 * Client 客户端,如同例子中的 笔记本*/
public class Client {

    /**
     * 充电
     */
    public void Test(Target target){
        target.charge();
    }
    public static void main(String[] args) {
        Client client = new Client();
        Target target = new Adapter();
        client.Test(target);
    }
}

对象适配器模式

/**
 * Adaptee 源角色 如例子中的双向插口*/
public class Adaptee {
    public void charge(){
        System.out.println("插入两向插头,给你充电了......");
    }
}
/**
 * Target 目标角色 如例子中的三向插口*/
public interface Target {
    void charge();
}
/**
 * ObjectAdapter 对象适配器 如例子中的排插*/
public class ObjectAdapter implements Target {

    private Adaptee adaptee;

    @Override
    public void charge() {
        adaptee.charge();
    }
    public ObjectAdapter(Adaptee adaptee) {
        super();
        this.adaptee = adaptee;
    }
}
/**
 * Client 客户端,如同例子中的 笔记本*/
public class Client {

    /**
     * 充电
     */
    public void Test(Target target){
        target.charge();
    }
    
    public static void main(String[] args) {
        Client client = new Client();
        Adaptee adaptee = new Adaptee();
        Target target2 = new ObjectAdapter(adaptee);
        client.Test(target2);
    }
}

 建议尽量使用对象适配器的实现方式,多用合成/聚合、少用继承。

posted @ 2016-09-02 09:56  星星满天  阅读(174)  评论(0编辑  收藏  举报