前言

博主github

博主个人博客http://blog.healerjean.com

1、Adapter介绍

1.1、Adapter 模式。有两种

Adapter 模式。有两种

1、使用继承的适配器:类适配器模式

2、使用委托的适配器:对象适配器

1.2、适配器模式和装饰器模式的区别

装饰器与适配器都有一个别名叫做 包装模式( Wrapper ),它们看似都是起到包装一个类或对象的作用,但是使用它们的目的很不一样。

1、适配器模式将一个接口转变成另一个接口或者添加新的接口

2、装饰器模式不是要改变被装饰对象的接口,而是恰恰要保持原有的接口,但是增强原有对象的功能,或者改变原有对象的处理方式而提升性能。所以这两个模式设计的目的是不同的。

2、适配器模式

现在实际情况是 我们的电压是100V的,但是我们想要的是220V的电压,现在我们希望底层还是用它,也就是说基于100V 的实现,但是我们以后都不会再用着100V了

2.1、实际情况

2.1.1、实际情况 Banner

/**
 * 目前的实际情况
 */
public class Banner  {

    public String string;

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


2.1.2、测试Main

public class Main {
    public static void main(String[] args) {

        Banner  s = new Banner("\"Hello\"") ;
        s.showWithAster();
        s.showWithParen();
    }

2.2、第一种:使用继承的适配器

1558686754766

2.2.1、Print 接口


public interface  Print {

      void printWeak();

      void printStrong();
}

2.2.2、PrintBanner 适配器,继承实现

适配器继承上面的 banner,这样就具备了 banner里面的公共属性

/**
 * 适配器角色
 */
public class AdapterPrintBanner extends Banner implements Print {


    public AdapterPrintBanner(String string) {
        super(string);
    }

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

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

2.2.3、测试Main

public class Main {
    
    public static void main(String[] args) {


        Print p = new AdapterPrintBanner("Hello");

        p.printWeak();

        p.printStrong();

    }
}

2.3、第二种:使用委托的适配器

2.3.1、Print 抽象类

public interface  Print {

      void printWeak();

      void printStrong();
}

2.3.2、AdapterPrintBanner 适配器委托实现

/**
 * 适配器,委托实现,聚合
 */
public class AdapterPrintBanner implements Print {

    private Banner banner;

    public AdapterPrintBanner(String string) {
        this.banner = new Banner(string);
    }

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

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

2.3.3、测试Main

public class Main {

    public static void main(String[] args) {

        Print p = new AdapterPrintBanner("Hello");

        p.printWeak();

        p.printStrong();
    }
}

2.4、现在的情况

我们使用的是 Print 接口来进行编程的,对于 Mian 而言,Banner 类中的被隐藏起来了,这就比如是 220V 的工作了起来,但是实际上是 100V 的电压转化而成的。

3、UML

3.1、 类适配器模式(使用继承)

1558689013642

3.2、对象适配器模式(使用委托)

1558689101738

3.3、Adapter登场角色

3.3.1、Target(对象)

该角色负责定义所需要的方法,示例程序中Print所扮演的角色

3.3.2、Client(请求者)

该角色q负责使用Target角色所定义的方法进行具体处理,示例程序中的Main扮演这个角色

3.3.3、Adapter (适配器 )

该角色是主人公,使用Adaptee角色的方法匹配旧的需求,然后实现或者继承Print来满足现状的需求

3.3.4、Adaptee(被适配)

该角色是被适配的角色 在继承中是被继承 、在委托中是被聚合