继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【学习笔记】适配器设计模式

Sivel
关注TA
已关注
手记 16
粉丝 9
获赞 50

适配器模式(包含对象适配器,类适配器)

定义:

将一个类的接口转换成客户期望的另一个接口

特点:

使原本接口不兼容的类可以一起工作

类型 : 结构型

适用场景

  • 已存在的类,它的方法和需求不匹配时(结果相同或者相似)
  • 非软件设计阶段考虑的设计模式,而是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不同情况下的解决方案。

优点

  • 能够提高类的透明性和复用,现有的类可以复用并且不需要改变。解决了现有类和目标类不匹配的问题。
  • 目标类和适配器类
  • 符合开闭原则(只需要扩展适配器的类,原有的类不需要改变 )

缺点

  • 需要对过程全面考虑,因为是亡羊补牢的做法,因此对认知程度要求比较高。并且可能会增加系统的复杂性
  • 系统代码的可读性会降低。比如我调用的是第一个,但是后面被适配成了第二个。

相关设计模式

  • 适配器 和 外观模式
    都是对现有的类进行封装。外观模式是定义一个新的接口,而适配器则是复用一个原有的接口。适配器是两个已有的接口协同工作,而外观
    则是在现有的系统中提供一个更为方便的访问入口。如果强行将外观模式也称为适配器模式的话,外观模式强调的是适配整个子系统,也就
    说外观所针对的力度更大。
  • 装饰者 和 适配器

类适配器

/**
 * 被适配者
 * @author jiahaowei
 */
public class Adaptee {

    public void adapterRequest() {
        System.out.println("被适配者的方法");
    }
}
/**
 * 适配者
 * @author jiahaowei
 */
public class Adapter extends Adaptee implements Target {

    @Override
    public void request() {

        //增加逻辑代码
        super.adapterRequest();
        //增加逻辑代码
    }
}
//目标
public interface Target {
    void request();
}
//具体修改的目标
public class ConcreteTarget implements Target {

    @Override
    public void request() {
        System.out.println("ConcreteTarget的目标方法");
    }
}

对应的uml类图
图片描述

对象适配器

通过上面的代码可以看出来比较适配器模式比较简单,我认为比之前的设计模式容易理解。对象适也只是把继承换成了对象的声明。

/**
 * 被适配者
 * @author jiahaowei
 */
public class Adaptee {

    public void adapterRequest() {
        System.out.println("被适配者的方法");
    }
}
public class Adapter implements Target {

    private Adaptee adaptee = new Adaptee();

    @Override
    public void request() {

        //增加逻辑代码
        adaptee.adapterRequest();
        //增加逻辑代码
    }
}

public class ConcreteTarget implements Target {

    @Override
    public void request() {
        System.out.println("ConcreteTarget的目标方法");
    }
}
public interface Target {
    void request();
}

对应的uml类图
图片描述

下面举例一个生活中的简单例子,220v交流点变为5v直流电。

public class AC220 {

    public int outputAC220V() {
        int output = 220;
        System.out.println("输出交流电" + output + "V");
        return output;
    }
}
public interface DC5 {
    int outputD5V();
}
public class PowerAdapter implements DC5 {
    private AC220 ac220 = new AC220();

    @Override
    public int outputD5V() {
        int adapterInput = ac220.outputAC220V();

        //变压器 ***

        //为了方便直接除44
        int adapterOutput = adapterInput / 44;

        System.out.println("使用powerrAdapter输入AC:" + adapterInput + "v" + "输出Dc:" + adapterOutput + "v");
        return adapterOutput;
    }
}
public class test {

    public static void main(String[] args) {

        DC5 dc5 = new PowerAdapter();
        dc5.outputD5V();
    }
}

//输出
输出交流电220V
使用powerrAdapter输入AC220v输出Dc:5v
打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP