适配器模式听说过吗?

今天开始我们就要进入到结构型的设计模式学习之中了,今天讲的设计模式是23种设计模式的第六种——适配器模式。通俗的讲,适配器的作用就是将两个互不兼容的东西进行一个适配的操作,它作为中间的桥梁。 下面我们进入适配器模式的学习。

应用前景:

在现实生活中,适配器这样的例子随处可见。就比如用直流电的笔记本电脑接交流电源时需要一个电源适配器,中国人和外国人交流,中间需要一个翻译等等。

在软件设计中也可能出现:需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时用适配器模式就能很好地解决这些问题。

适配器模式的概念:

将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

其别名为包装器。

特点:

适配器模式的主要优点:

  • 客户端通过适配器可以透明地调用目标接口。
  • 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
  • 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。

其缺点是:

  • 对类适配器来说,更换适配器的实现过程比较复杂。
适配器模式工作原理:
  • 适配器模式:将一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容。
  • 从用户的角度看不到被适配者,它与目标类是解耦的。
  • 用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法。
  • 用户收到反馈结果,感觉只是和目标接口交互。

1.类适配器模式

思路分析:

代码:

适配接口:

package cn.ppdxzz.adapter.classadapter;

/**
 * Description:适配接口,输出5V的电压
 *
 * @Date: 2020/3/8 16:22
 * @Author: PeiChen
 */
public interface Voltage5V {
    //定义一个输出5V电压的方法
    int output5V();
}

被适配的类:

package cn.ppdxzz.adapter.classadapter;

/**
 * Description:被适配的类,正常输出220V电压,需要被适配成5V电压
 *
 * @Date: 2020/3/8 16:32
 * @Author: PeiChen
 */
public abstract class Voltage220V {
    //输出220V的电压
    public int output220V() {
        int voltage = 220;
        System.out.println("当前电压:" + voltage + "V");
        return voltage;
    }
}

充电类:

package cn.ppdxzz.adapter.classadapter;

/**
 * Description:充电
 *
 * @Date: 2020/3/8 16:25
 * @Author: PeiChen
 */
public class Phone {
    //定义一个给手机充电的方法
    public void charging(Voltage5V v) {
        if (v.output5V() == 5) {
            System.out.println("电压5V,允许充电");
        }else if (v.output5V() > 5){
            System.out.println("电压过高,无法充电");
        }else {
            System.out.println("电压异常,禁止充电");
        }

    }
}

适配器类:

package cn.ppdxzz.adapter.classadapter;

/**
 * Description:适配器类,这里要将220V电压适配成5V的电压
 *
 * @Date: 2020/3/8 16:37
 * @Author: PeiChen
 */
public class VoltageAdapter extends Voltage220V implements Voltage5V {
    //220V电压适配成5V电压
    @Override
    public int output5V() {
        int targetVoltage = 0;
        //1.获取到需被适配的220V电压
        int v = output220V();
        //2.返回已适配的5V电压
        targetVoltage = v/44;
        System.out.println("适配完成,当前电压:" + targetVoltage + "V");

        return targetVoltage;
    }
}

类适配器模式测试:

package cn.ppdxzz.adapter.classadapter;

/**
 * Description:类适配器模式
 *
 * @Date: 2020/3/8 16:44
 * @Author: PeiChen
 */
public class Client {
    public static void main(String[] args) {
        Phone phone = new Phone();
        //传入5V电压
        phone.charging(new VoltageAdapter());
    }
}

输出结果:

当前电压:220V
适配完成,当前电压:5V
电压5V,允许充电

2.对象适配器模式

思路分析:

代码:

适配接口:

package cn.ppdxzz.adapter.objectadapter;
/**
 * Description:适配接口,输出5V的电压
 *
 * @Date: 2020/3/8 17:04
 * @Author: PeiChen
 */
public interface Voltage5V {
    //定义一个输出5V电压的方法
    int output5V();
}

被适配的类:

package cn.ppdxzz.adapter.objectadapter;
/**
 * Description:被适配的类
 *
 * @Date: 2020/3/8 17:06
 * @Author: PeiChen
 */
public class Voltage220V {
    //输出220V的电压
    public int output220V() {
        int voltage = 220;
        System.out.println("当前电压:" + voltage + "V");
        return voltage;
    }
}

充电类:

package cn.ppdxzz.adapter.objectadapter;
/**
 * Description:充电
 *
 * @Date: 2020/3/8 17:07
 * @Author: PeiChen
 */
public class Phone {
    //定义一个给手机充电的方法
    public void charging(Voltage5V v) {
        if (v.output5V() == 5) {
            System.out.println("电压5V,允许充电");
        } else if (v.output5V() > 5) {
            System.out.println("电压过高,无法充电");
        }else {
            System.out.println("电压异常,禁止充电");
        }

    }
}

适配器类:

package cn.ppdxzz.adapter.objectadapter;

/**
 * Description:适配器类,这里要将220V电压适配成5V的电压
 *
 * @Date: 2020/3/8 17:09
 * @Author: PeiChen
 */
public class VoltageAdapter implements Voltage5V {
    private Voltage220V voltage220V;//聚合注入
    public VoltageAdapter() {
    }
    //通过构造器传入220V电压
    public VoltageAdapter(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }

    @Override
    public int output5V() {
        int targetVoltage = 0;
        if (voltage220V != null) {
            //1.获取到需被适配的220V电压
            int output220V = voltage220V.output220V();//得到需被适配的220V电压
            //2.返回已适配的5V电压
            targetVoltage = output220V/44;
            System.out.println("适配完成,当前电压:" + targetVoltage + "V");
        }
        return targetVoltage;
    }
}

对象适配器模式测试:

package cn.ppdxzz.adapter.objectadapter;

/**
 * Description:对象适配器模式
 *
 * @Date: 2020/3/8 17:22
 * @Author: PeiChen
 */
public class Client {
    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter(new Voltage220V()));
    }

}

输出结果:

当前电压:220V
适配完成,当前电压:5V
电压5V,允许充电

3.接口适配器模式

思路分析:

代码:

适配接口:

package cn.ppdxzz.adapter.interfaceadapter;

/**
 * Description:适配接口
 *
 * @Date: 2020/3/8 17:36
 * @Author: PeiChen
 */
public interface InterfaceTest {
    //定义三个测试方法
    void test1();
    void test2();
    void test3();

}

适配器抽象类:

package cn.ppdxzz.adapter.interfaceadapter;
/**
 * Description:AbstractAdapter抽象类,默认实现接口的所有方法
 *
 * @Date: 2020/3/8 17:40
 * @Author: PeiChen
 */
public abstract class AbstractAdapter implements InterfaceTest {
    @Override
    public void test1() {

    }
    @Override
    public void test2() {

    }
    @Override
    public void test3() {

    }
}

接口适配器模式测试:

package cn.ppdxzz.adapter.interfaceadapter;
/**
 * Description:接口适配器模式
 *
 * @Date: 2020/3/8 17:42
 * @Author: PeiChen
 */
public class Client {
    public static void main(String[] args) {
        //匿名内部类
        AbstractAdapter adapter = new AbstractAdapter() {
            @Override
            public void test1() {
                super.test1();
                System.out.println("测试test1方法");
            }
        };
        adapter.test1();
    }
}

输出结果:

测试test1方法
适配器模式源码分析:

SpringMVC中的HandlerAdapter就使用到了适配器模式。

总结:

适配器模式最大的作用还是将原本不兼容的接口融合在一起工作。

适配器模式到这里就讲解完毕了,后续会继续更新剩下的设计模式,敬请期待。

            super.test1();
            System.out.println("测试test1方法");
        }
    };
    adapter.test1();
}

}


输出结果:

```markdown
测试test1方法
适配器模式源码分析:

SpringMVC中的HandlerAdapter就使用到了适配器模式。

[外链图片转存中…(img-ucQeFOeC-1587272709049)]

总结:

适配器模式最大的作用还是将原本不兼容的接口融合在一起工作。

适配器模式到这里就讲解完毕了,后续会继续更新剩下的设计模式,敬请期待。

微信公众号,JavaAnything,期待你的关注!
在这里插入图片描述

<think>嗯,用户问的是C++中的设计模式,这个我得好好想想怎么回答。首先,设计模式是软件设计中常见问题的解决方案,对吧?可能用户已经听说过这个概念,但不太清楚具体是什么,或者想深入了解在C++中的应用。 我应该先给设计模式一个明确的定义,然后说明它们的作用,比如提高代码复用性、可维护性之类的。接着可能需要分类,比如创建型、结构型、行为型,每种类型举几个例子,这样用户更容易理解。 用户可能对C++比较熟悉,所以在举例的时候要结合C++的特性,比如工厂模式用类来实现,单例模式中的静态成员等等。要注意代码示例的正确性,但不需要太详细,毕竟用户可能只是想要一个概述。 另外,用户可能想知道为什么设计模式在C++中重要,比如资源管理、多态的应用,或者与其他语言的区别。可能需要提到C++的RAII,内存管理如何影响设计模式的实现。 还要考虑用户的背景,可能是中级开发者,正在学习设计模式,或者在实际项目中遇到问题,想寻找解决方案。因此,回答需要结构清晰,分点说明,每个模式简单解释,用途和例子。 有没有可能用户混淆了设计模式和C++本身的特性?比如模板元编程是不是设计模式的一部分?可能需要澄清设计模式是通用的,不限于特定语言,但在C++中有特定的实现方式。 确保回答符合之前的系统指令,比如数学公式的格式,但这里可能用不上。不过要检查是否有中文错误,用词是否准确。结构上分点说明,帮助用户逐步理解,从概念到分类再到具体例子,最后总结意义。 可能遗漏一些常见模式,比如观察者模式、策略模式,这些在C++中也很常用,应该包含进去。另外,强调设计模式不是万能的,需要根据实际情况选择,避免过度设计。 总之,组织信息时要先总后分,先介绍概念,再分类讲解,每个类别举两三个例子,说明其用途和C++中的实现特点,最后总结学习设计模式的好处,帮助用户建立全面的认识。</think>在 C++ 中,设计模式是经过验证的、可重复使用的代码设计模板,用于解决软件设计中常见问题。它们通过结构化代码关系提高可维护性、灵活性和复用性。以下是逐步说明: --- ### 一、设计模式的分类 设计模式通常分为以下三类: 1. **创建型模式** 🛠️ 解决对象创建机制问题 - **单例模式**:确保一个类只有一个实例(例如全局配置对象) ```cpp class Singleton { private: static Singleton* instance; Singleton() {} // 私有构造函数 public: static Singleton* getInstance() { if (!instance) instance = new Singleton(); return instance; } }; ``` - **工厂模式**:通过工厂类创建对象,隐藏具体实现(例如图形渲染接口的创建) 2. **结构型模式** 🧱 处理类与对象的组合关系 - **适配器模式**:转换接口兼容性(例如将旧版API适配到新系统) - **代理模式**:为对象提供代理以控制访问(例如延迟加载大型资源) 3. **行为型模式** 🔄 优化对象间的通信与职责分配 - **观察者模式**:定义对象间的一对多依赖(例如事件通知系统) - **策略模式**:动态切换算法实现(例如排序算法的灵活替换) --- ### 二、C++ 中设计模式的特点 1. **多态与抽象基类** 通过虚函数和接口类实现运行时行为扩展(例如策略模式的核心实现) ```cpp class Strategy { public: virtual void execute() = 0; // 抽象接口 }; ``` 2. **资源管理** 结合 RAII(Resource Acquisition Is Initialization)确保资源安全(例如工厂模式中智能指针的应用) 3. **模板元编程** 利用模板实现编译时多态(例如策略模式的静态版本) --- ### 三、学习设计模式的意义 1. **提升代码质量** - 减少重复代码(DRY原则) - 降低模块耦合度(高内聚低耦合) 2. **解决典型问题** - 对象生命周期管理(单例、工厂) - 跨模块通信(观察者、中介者) 3. **团队协作标准化** 提供通用术语(例如“使用装饰器模式扩展功能”) --- ### 四、经典书籍推荐 - 《设计模式:可复用面向对象软件的基础》(GoF 经典著作) - 《Effective C++》与《Modern C++ Design》(结合语言特性的实践指南) 学习时需注意:**设计模式是工具而非教条**,需根据实际场景合理选择,避免过度设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮的小猪仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值