设计模式-Adapter模式

Adapter模式

什么是Adapter模式?

Adapter即适配器的意思,它很像我们生活中用到的手机充电器,将220V电压转换成手机需要的5V或是9V电压;这其实就是适配器的作用,它位于实际情况(220V电压)与需求(5V或9V电压)之间,填补两者之间的差异;

Adapter模式的作用

位于实际情况(现有的类,方法等)与需求(希望实现的功能)之间,填补现有程序和所需程序之间的差异;(下文会举例说明什么是实际情况,什么是需求)
- 适配现有的类,生成新类;
- 使用经过充分测试的类作为组件,减少测试工作量,并可以快速定位bug;
- 版本升级时,可以将新版本扮演Apdatee角色,让旧版本扮演Target角色,编写一个扮演Adapter角色的类,实现新旧版本的兼容;

Adapter模式的分类

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

类适配器模式举例

假设我们现在有一个Banner类,它包含两个方法,showWithParen()方法将输入的字符串加’( )’输出,showWithAster()方法将输入的字符串加’* *’输出;这个Banner相当于我们开头提到的200V电压这一“实际情况”

假设我们现在有一个Print接口需要实现,该接口中声明了两个方法,分别是弱化字符串显示的printWeak()方法,即将字符串加’( )’输出,和强调字符串显示的printStrong()方法,即将字符串加’* *’显示;这相当于我们开头提到的手机需要的5V或9V电压这一“需求”

那我们现在需要做的就是使用Banner类编写一个实现了Print接口的类,这个类就相当于一个适配器;它处于我们现有的类和想要实现的接口之间,填补两者之间的差异,发挥了适配的作用;

类适配器模式代码

Banner类:

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类:

public class PrintBanner extend 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();
    }
}
UML用例图

委托模式示例代码

Print类:

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

PrintBanner类:

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

Adapter模式角色分析

Target
负责定义所需的方法,Print接口;它是我们实际所需要的东西或是所需要的接口;

Client
调用者,Main;

Adaptee
被适配者;它是我们现有的东西,比如一些测试通过的类、方法;

Adapter
适配者;它是一个组装者或是说改造者,将现有的类、方法等组合,改造,变成我们实际情况所需要的东西;

UML图

使用继承:

使用委托:

注:该博客内容为学习<<图解设计模式>>记录,文中所涉及的例子,UML图均摘录自<<图解设计模式>>;

你可能感兴趣的:(设计模式)