设计模式-结构型模式之适配器模式

定义

适配器模式(Adapter Pattern) :将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。

相关角色
Target:目标抽象类
Adapter:适配器类
Adaptee:适配者类
Client:客户类

解决问题

使接口不兼容的那些类可以一起工作。

UML类图

设计模式-结构型模式之适配器模式_第1张图片
adapter.png

例子

适配器分两种

  • 类的适配器
  • 对象适配器

具体场景是: 在生活中,我们买的电器插头是2个孔的,但是我们买的插座只有三个孔的,此时我们就希望电器的插头可以转换为三个孔的,这样我们就可以直接把它插在插座上,此时三个孔插头就是客户端期待的另一种接口,自然两个孔的插头就是现有的接口。

类的适配器

IThreeHole

public interface IThreeHole {
     void request();
}

TwoHole

public abstract class TwoHole {
    public void specificRequest()
    {
        System.out.println("我是两个孔的插头");
    }
}

PowerAdapter

public class PowerAdapter extends TwoHole implements IThreeHole {

    @Override
    public void request() {
        this.specificRequest();
    }

}

对象适配器

TwoHole

public class TwoHole {
    public void specificRequest() {
        System.out.println("我是两个孔的插头");
    }
}

ThreeHole

public abstract class ThreeHole {
    public abstract void request();
}

PowerAdapter

public class PowerAdapter extends ThreeHole {
    private TwoHole twoHole = new TwoHole();

    @Override
    public void request() {
        twoHole.specificRequest();
    }
}

优缺点

类的适配器模式

优点:

  • 可以在不修改原有代码的基础上来复用现有类,很好地符合 “开闭原则”;
  • 可以重新定义Adaptee(被适配的类)的部分行为,因为在类适配器模式中,Adapter是Adaptee的子类;
  • 仅仅引入一个对象,并不需要额外的字段来引用Adaptee实例(这个即是优点也是缺点)。
    缺点:
  • 用一个具体的Adapter类对Adaptee和Target进行匹配,当如果想要匹配一个类以及所有它的子类时,类的适配器模式就不能胜任了。因为类的适配器模式中没有引入Adaptee的实例,光调用this.SpecificRequest方法并不能去调用它对应子类的SpecificRequest方法;
  • 采用了 “多继承”的实现方式,带来了不良的高耦合。

对象的适配器模式

优点:

  • 可以在不修改原有代码的基础上来复用现有类,很好地符合 “开闭原则”(这点是两种实现方式都具有的);
  • 采用 “对象组合”的方式,更符合松耦合。
    缺点:
  • 使得重定义Adaptee的行为较困难,这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是引用Adaptee本身。

延伸

你可能感兴趣的:(设计模式-结构型模式之适配器模式)