您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 3浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

java设计模式——适配器模式

小志的博客 发布时间:2020-06-24 11:31:45 ,浏览量:3

适配器模式目录
    • 一、适配器模式的定义与类型
    • 二、适配器模式的适用场景
    • 三、适配器模式的优点
    • 四、适配器模式的缺点
    • 五、适配器模式的扩展
    • 六、适配器模式相关的设计模式
    • 七、类适配器示例
    • 八、对象适配器示例
    • 九、适配器模式具体实例演示

一、适配器模式的定义与类型

1、定义

  • 将一个类的接口转换成客户期望的另一个接口
  • 使原本接口不兼容的类可以一起工作

2、类型

  • 结构型
二、适配器模式的适用场景
  • 已经存在的类,它的方法和需求不匹配时(方法结果相同或相似)
  • 不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品,不同厂家造成功能类似而接口不相同情况下的解决方案
三、适配器模式的优点
  • 能提高类的透明性和复用,现有的类复用但不需要改变
  • 目标类和适配器类解耦,提高程序扩展性
  • 符合开闭原则
四、适配器模式的缺点
  • 适配器编写过程需要全面考虑,可能会增加系统的复杂性
  • 增加系统代码可读的难度
五、适配器模式的扩展

1、对象适配器

  • 通过直接关联,或者委托机制实现。

2、类适配器

  • 通过类继承实现
六、适配器模式相关的设计模式
  • 适配器模式和外观模式
七、类适配器示例

1、代码如下:

// 创建一个被适配者类,已存在的、具有特殊功能、但不符合我们既有的标准接口的类
public class ByAdaptee {
    public void byAdapteeMethod(){
        System.out.println("被适配类方法 具有特殊功能...");
    }
}

//创建一个目标接口,或称为标准接口
public interface Target {
    public void method();
}

//创建一个目标的实现类,只提供普通功能
public class TargetImpl implements Target{
    @Override
    public void method() {
        System.out.println("目标的实现类方法,具有普通功能...");
    }
}

//创建一个适配者类,继承被适配者类并且实现目标接口
public class Adaptee extends ByAdaptee implements Target {
    //适配者类通过调用父类(ByAdaptee)的被适配者类的方法,从而实现了目标类(Target)
    @Override
    public void method() {
        super.byAdapteeMethod();
    }
}

//类适配器模式的测试类,类适配器模式强调的是继承,通过继承获取被适配者的方法
public class Test {
    public static void main(String[] args) {
        /**
         * 直接调用目标类的具体实现类的方法,使用普通功能类
         */
        Target target = new TargetImpl();
        target.method();
       /**
        *   因为适配器类(Adaptee)实现类目标类(Target),
        *  所以目标类(Target)的具体实现,通过适配器类(Adaptee)移交给了被适配者类(ByAdaptee)
        */
        Target target1 = new Adaptee();
        target1.method();
    }
}

2、输出结果如下: 在这里插入图片描述

3、类图如下: 在这里插入图片描述

八、对象适配器示例

1、代码如下:

//创建一个被适配者类,已存在的、具有特殊功能、但不符合我们既有的标准接口的类
public class ByAdaptee {
    public void byAdapteeMethod(){
        System.out.println("被适配类方法 具有特殊功能...");
    }
}

//创建一个目标接口,或称为标准接口
public interface Target {
    public void method();
}

//创建一个目标的实现类,只提供普通功能
public class TargetImpl implements Target{
    @Override
    public void method() {
        System.out.println("目标的实现类方法,具有普通功能...");
    }
}

//创建一个适配者类,实现目标接口
public class Adaptee implements Target{
    /**
     * 因为没有继承,无法调用父类被适配者类(ByAdaptee)的方法
     * 把被适配者类(ByAdaptee)组合到适配者类(Adaptee)中,即直接关联的方式或委托机制的方式
     */
    private ByAdaptee byAdaptee=new ByAdaptee();

    @Override
    public void method() {
        byAdaptee.byAdapteeMethod();
    }
}

package com.rf.designPatterns.structural.adapter.objectAdapter;


//对象适配器模式的测试类,对象适配器模式强调的是组合,通过组合获取被适配者的方法
public class Test {
    public static void main(String[] args) {
        /**
         * 直接调用目标类的具体实现类的方法
         */
        Target target = new TargetImpl();
        target.method();
        /**
         *   因为适配器类(Adaptee)实现类目标类(Target),
         *  所以目标类(Target)的具体实现,通过适配器类(Adaptee)移交给了被适配者(ByAdaptee)
         */
        Target target1 = new Adaptee();
        target1.method();
    }
}

2、输出结果如下: 在这里插入图片描述

3、类图如下: 在这里插入图片描述

九、适配器模式具体实例演示

实例描述:把220V交流电通过适配器转换成5V的直流电

1、代码如下:

// 创建被适配者 220伏交流电类
public class AC220 {
    public int outputAC220(){
        int output=220;
        System.out.println("输出交流电"+output+"V");
        return output;
    }
}

//创建目标类 5伏直流电接口
public interface DC5 {
    //输出5伏直流电方法
    public int outputDC5();
}

//创建电源适配器类
public class PowerAdapter implements DC5{

    private AC220 ac220=new AC220();
    
    @Override
    public int outputDC5() {
        //获取输入的220伏交流电
        int adapterInput =ac220.outputAC220();
        //模拟变压器逻辑
        int adapterOutput=adapterInput/44;
        System.out.println("通过电源适配器(PowerAdapter)类输入交流电:"+adapterInput+"V,"+"输出直流电:"+adapterOutput+"V");
        return adapterOutput;
    }
}

//测试类
public class Test {
    public static void main(String[] args) {
        DC5 dc5 = new PowerAdapter();
        dc5.outputDC5();
    }
}

2、输出结果如下: 在这里插入图片描述 3、类图如下: 在这里插入图片描述

关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0557s