• 设计模式(13)适配器模式


    一、介绍:

    1、定义:是一种结构型设计模式,它可以将一个类的接口转换成客户端所期望的另一种接口。适配器模式常用于系统的不兼容性问题。

    2、组成:

    (1)目标接口(Target):客户端所期望的接口,适配器通过实现目标接口来对外提供服务。

    (2)适配器(Adapter):将源接口转换成目标接口的类,它实现了目标接口,并且包含一个对源接口的引用。

    (3)源接口(Adaptee):需要被适配的类,其接口与目标接口不兼容。

    3、UML类图:

    4、优缺点:

    (1)优点:

    更好的复用性:系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。
    更好的扩展性:在实现适配器功能的时候,可以扩展自己源的行为(增加方法),从而自然地扩展系统的功能。
    完美实现解耦,通过增加适配器类将适配者与目标接口联系起来,无需修改原有实现;
    符合开闭原则

    (2)缺点:会导致系统紊乱:滥用适配器,会让系统变得非常零乱。例如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

    5、适配器模式有2种:面向类的适配器模式,面向对象的适配器模式。常说的是对象适配器。

    二、demo:

    1、类适配器模式:

    1. //源:
    2. class Person {
    3. public void speakJapanese() {
    4. System.out.println("I can speak Japanese!");
    5. }
    6. public void speakEnglish() {
    7. System.out.println("I can speak English!");
    8. }
    9. }
    10. //目标:
    11. interface Target {
    12. void speakJapanese();
    13. void speakEnglish();
    14. void speakFrench();
    15. }
    16. //适配器:
    17. class Adapter extends Person implements Target {
    18. @Override
    19. public void speakFrench() {
    20. }
    21. }

    2、对象适配器模式:把“源”作为一个对象聚合到适配器类中。

    1. //源
    2. class Person {
    3. public void speakJapanese() {
    4. System.out.println("I can speak Japanese!");
    5. }
    6. public void speakEnglish() {
    7. System.out.println("I can speak English!");
    8. }
    9. }
    10. //对象
    11. interface Target {
    12. void speakJapanese();
    13. void speakEnglish();
    14. void speakFrench();
    15. }
    16. //适配器
    17. class Adapter implements Target {
    18. Person mPerson;
    19. public Adapter(Person person) {
    20. this.mPerson = person;
    21. }
    22. @Override
    23. public void speakJapanese() {
    24. mPerson.speakJapanese();
    25. }
    26. @Override
    27. public void speakEnglish() {
    28. mPerson.speakEnglish();
    29. }
    30. @Override
    31. public void speakFrench() {
    32. }
    33. }

    3、接口适配器模式(缺省适配模式):

    这种模式的核心归结如下:当你想实现一个接口但又不想实现所有接口方法,只想去实现一部分方法时,就用默认的适配器模式,他的方法是在接口和具体实现类中添加一个抽象类,而用抽象类去空实现目标接口的所有方法。而具体的实现类只需要覆盖其需要完成的方法即可。

    1. public interface Job {
    2. public abstract void speakJapanese();
    3. public abstract void speakEnglish();
    4. public abstract void speakFrench();
    5. public abstract void speakChinese();
    6. }
    7. public abstract class JobDefault implements Job{
    8. public void speakChinese() {
    9. }
    10. public void speakEnglish() {
    11. }
    12. public void speakFrench() {
    13. }
    14. public void speakJapanese() {
    15. }
    16. }
    17. public class JobImpl extends JobDefault{
    18. public void speakChinese(){
    19. System.out.println("I can speak Chinese!");
    20. }
    21. }

  • 相关阅读:
    互联网广告人--联合御寒--品牌,代理,平台,达人 多方携手御寒
    C++从入门到精通——初步认识面向对象及类的引入
    SpringMVC综合案例
    进度时间紧、人少、需求不规范,测试人员怎么办?
    Linux:redis集群(3.*版本 和 5.*版本)搭建方法
    以技术创新引领行业发展,飞凌嵌入式获双项省级荣誉
    C++多线程入门
    LeetCode·707.设计链表·架构题
    学之思项目第一天-完成项目搭建
    全网最全的AItium Designer 16下载资源与安装步骤
  • 原文地址:https://blog.csdn.net/w_t_y_y/article/details/134010731