设计模式-适配器(Adapter)

81 阅读1分钟

场景

1.jpeg

如图, 适配器将交流电100伏特电压转为直流12伏特供电脑使用。
在程序中,经常会存在现有的程序不能直接使用,需要适当的变换之后才能使用的情况,这种填补 现有程序所需程序之间差异的设计模式就是适配器模式

适配器类图

继承的形式

适配器类图.jpeg

委托的形式

适配器类图2.jpeg

Client: 请求者
Target: 定义所需要的方法
Adaptee: 被适配者
Adapter: 适配器

代码实现

继承形式适配器代码实现

/**
 * 被适配者
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Banner {
    /**
     * 字符串
     */
    private String str;

    /**
     * 字符串加括号
     */
    public void showWithParen() {
        System.out.println("(" + str + ")");
    }

    /**
     * 字符串加星
     */
    public void showWithAster() {
        System.out.println("*" + str + "*");
    }
}
/**
 * 需求的接口
 */
public interface Print {
    /**
     * 弱化
     */
    void printWeak();

    /**
     * 强化
     */
    void printStrong();
}
/**
 * 扮演适配器的角色
 */
public class PrintBanner extends Banner implements Print {
    public PrintBanner(String s) {
        super(s);
    }

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

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

3.jpeg

委托形式适配器代码实现

/**
 * 被适配者
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Banner {
    /**
     * 字符串
     */
    private String str;

    /**
     * 字符串加括号
     */
    public void showWithParen() {
        System.out.println("(" + str + ")");
    }

    /**
     * 字符串加星
     */
    public void showWithAster() {
        System.out.println("*" + str + "*");
    }
}
/**
 * 需要的接口
 */
public abstract class Print2 {
    /**
     * 弱化
     */
    public abstract void printWeak();

    /**
     * 强化
     */
    public abstract void printStrong();
}
@Data
public class PrintBanner2 extends Print2 {
    private Banner banner;

    public PrintBanner2(String s) {
        this.banner = new Banner(s);
    }

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

    @Override
    public void printStrong() {
        banner.showWithAster();
    }
}
public class Main {
    public static void main(String[] args) {
        Print2 p2 = new PrintBanner2("Hello");
        p2.printStrong();
        p2.printWeak();
    }
}

4.jpeg

什么时候使用适配器模式

代码版本升级和兼容性,假如我们以后只想维护新版本,可以让新版本扮演Adaptee角色,旧版本扮演Target角色,再编写一个Adapter角色,让它使用新版本的类来实现旧版本的类中的方法.

Xnip2022-11-26_17-16-57.jpg