• 欢迎访问 winrains 的个人网站!
  • 本网站主要从互联网整理和收集了与Java、网络安全、Linux等技术相关的文章,供学习和研究使用。如有侵权,请留言告知,谢谢!

图解设计模式(2):Adapter模式(加个适配器以便于复用)

设计模式 winrains 1年前 (2019-09-19) 43次浏览

在程序世界中,经常会存在现有的程序无法直接使用,需要做适当的变换之后才能使用的情况。这种用于填补“现有的程序”和“所需的程序”之间差异的设计模式就是Adapter模式。Adapter模式也被称为Wrapper模式(包装器模式)。
Aapter模式有以下两种:

  • 类适配器模式(使用继承的适配器)
  • 对象适配器模式(使用委托的适配器)

1 Adapter模式中的角色

  • Target(对象)

该角色负责定义所需的方法。对应示例中的Print接口(使用继承时)和Print类(使用委托时)。

  • Client(请求者)

该角色负责使用Target角色所定义的方法进行具体处理。对应示例中的Main类。

  • Adaptee(被适配)

Adaptee是一个持有既定方法的角色。对应示例中的Banner类。

  • Adapter(适配)

使用Adaptee(被适配)角色的方法来满足Target角色的需求,这是Adapter角色的作用。对应示例中的PrintBanner类。

2 类适配器模式的类图(使用继承)

3 对象适配器模式的类图(使用委托)

4 示例程序(使用继承)

示例程序类图

4.1 示例代码

public class Banner {
    private String string;
    public Banner(String string) {
        this.string = string;
    }
    public void showWithParen() {
        System.out.println("(" + string + ")");
    }
    public void showWithAster() {
        System.out.println("*" + string + "*");
    }
}

Print接口

public interface Print {
    public abstract void printWeak();
    public abstract void printStrong();
}

PrintBanner类

扮演适配器的角色,继承了Banner类,实现了Print接口。

public class PrintBanner extends Banner implements Print {
    public PrintBanner(String string) {
        super(string);
    }
    public void printWeak() {
        showWithParen();
    }
    public void printStrong() {
        showWithAster();
    }
}

Main类

测试程序。

public class Main {
    public static void main(String[] args) {
        Print p = new PrintBanner("Hello");
        p.printWeak();
        p.printStrong();
    }
}

运行结果

(Hello)
*Hello*

5 示例程序(使用委托)

委托是指将某个方法中的实际处理交给其他实例的方法。对应示例,当PrintBanner类的PrintWeak被调用时,并不是PrintBanner类自己进行处理,而是将处理交给了其他实例(Banner类的实例)的showWithParen方法。
示例程序类图

5.1 示例代码

Main类和Banner类与上例相同,此例中Print不是接口而是类。

Print类

public abstract class Print {
    public abstract void printWeak();
    public abstract void printStrong();
}

PrintBanner类

public class PrintBanner extends Print {
    private Banner banner;
    public PrintBanner(String string) {
        this.banner = new Banner(string);
    }
    public void printWeak() {
        banner.showWithParen();
    }
    public void printStrong() {
        banner.showWithAster();
    }
}

6 总结

Adapter模式会对现有的类进行适配,生成新的类。通过该模式可以很方便地创建我们需要的方法群。使用Adapter模式可以在完全不改变现有代码的前提下,使现有代码适配于新的接口。

摘自《图解设计模式》


版权声明:文末如注明作者和来源,则表示本文系转载,版权为原作者所有 | 本文如有侵权,请及时联系,承诺在收到消息后第一时间删除 | 如转载本文,请注明原文链接。
喜欢 (1)