一个适配器,可以提高程序的复用性


  Adapter模式也被称为Wrapper模式,有包装器的意思

  适配器模式在生活中还是很常见的,比如你笔记本上的电脑适配器,可以使用在110-220V之间变化的电脑,而笔记本还能正常工作,这也是适配器一个良好模式的体现,简单的说,适配器模式就是把一个接口或类转换成其他的接口或类,从另一方面来说,适配器模式也就是一个包装模式,为什么呢?他把Adaptee包装成一个Target接口的类,加了一层衣服,包装成另外一个靓妞了。大家知道,设计模式原是为建筑设计而服务的,软件设计模式只是结用了人家的原理而已。

适配器模式分为三种:类适配器,对象适配器,接口适配器

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

UML类图

实例程序中的所有类和接口

名字说明
Banner类有三个方法, 分别是用括号,星号和原样输出字符串
Print接口有三个方法,可以对字符串进行弱化,强调,和正常的显示
PrintBanner类适配器
Main类测试类

1. Banner类

package Adapter1;

/**
 * @author Moti
 * @Time 2019年9月16日
 */
public class Banner {
    private String str;
    public Banner(String str) {
        this.str = str;
    }
    public void showWithParen() {
        System.out.println("("+str+")");
    }
    public void showWithAster() {
        System.out.println("*"+str+"*");
    }
    public void showNormal() {
        System.out.println(str);
    }
} 

2. Print接口

package Adapter1;

/**
 * @author Moti
 * @Time 2019年9月16日
 */
public interface Print {
    public abstract void printWeak();
    public abstract void printStrong();
    public abstract void printNormal();
} 

3. PrintBanner类

package Adapter1;

/**
 * 使用继承的适配器
 * 继承了Banner类,也就继承了
 * showWithParen()和showWithAster()方法
 * 实现了Print 接口,也就实现了
 * printWeak()和printStrong()方法
 * @author Moti
 * @Time 2019年9月16日
 */
public class PrintBanner extends Banner implements Print {

    public PrintBanner(String str) {
        super(str);
    }

    @Override
    public void printWeak() {
        showWithParen();
    }

    @Override
    public void printStrong() {
        showWithAster();
    }

    @Override
    public void printNormal() {
        showNormal();
    }

} 

4. Main类

package Adapter1;

/**
 * 在Main类中,通过适配器PrintBanner来实现不同样式的文字的输出
 * 面向Print接口编程
 * @author Moti
 * @Time 2019年9月16日
 */
public class Main {
    public static void main(String[] args) {
        Print print = new PrintBanner("Hello World!");
        print.printWeak();
        print.printStrong();
        print.printNormal();
    }
} 

运行结果

对象适配器模式(使用委托的方式)

UML类图

实例程序中的所有类和接口

名字说明
Banner类有三个方法, 分别是用括号,星号和原样输出字符串
Print抽象类有三个方法,可以对字符串进行弱化,强调,和正常的显示
PrintBanner类适配器
Main类测试类

Banner类和Main类和第一种方式的代码完全一样
1. Print抽象类

package Adapter2;

/**
 * @author Moti
 * @Time 2019年9月16日
 */
public abstract class Print {
    public abstract void printWeak();
    public abstract void printStrong();
    public abstract void printNormal();
} 

2. PrintBanner类

package Adapter2;

/**
 * 使用委托的适配器
 * 实际的功能是由另一个类来实现的
 * @author Moti
 * @Time 2019年9月16日
 */
public class PrintBanner extends Print {
    Banner banner;
    PrintBanner(String string){
        this.banner = new Banner(string);
    }
    @Override
    public void printWeak() {
        banner.showWithParen();
    }

    @Override
    public void printStrong() {
        banner.showWithAster();
    }

    @Override
    public void printNormal() {
        banner.showNormal();
    }

} 

运行效果两种方式是一样的

接口适配器模式

  1. 一些书籍称为:适配器模式(Default Adapter Pattern)或缺省适配器模式。
  2. 当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求
  3. 适用于一个接口不想使用其所有的方法的情况。

在Adapter模式中登场了一下角色

  1. 目标角色(Target):系统所期待实现的目标。该角色需要定义所需要的方法.
  2. 源角色(Adaptee):系统原有的实现,被适配的角色。持有既定方法的角色.
  3. 适配器角色(Adapter):将原有实现转化成目标实现。实例程序中PrintBanner扮演这个角色

具体应用

在Spring MVC的HandlerAdapter使用了适配器模式

最后修改日期:2020-07-13

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。