设计模式之适应设计模式_Adapter模式_加一个适配器以便复用

前言

博主github

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

1、Adapter模式有两种

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

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

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

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

适配器模式将一个接口转变成另一个接口,它的目的是通过改变接口来达到重复使用的目的。当然也有适配之前的,并且创建跟多的方法。 因为新旧接口不一致导致出现了客户端无法得到满足的问题,但是,由于旧的接口是不能被完全重构掉的(比如不是我们代码中,而是别的jar包的对象),因为我们还想使用实现了这个接口的一些服务。那么为了使用以前实现旧接口的服务,我们就应该把新的接口转换成旧接口;实现这个转换的类就是抽象意义的转换器

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

2、实例程序

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

1、实际情况

1.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 + "*");
    }
}


1.1.2、测试Main

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

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

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

[外链图片转存失败(img-Y5DWBsbr-1566550452735)(https://raw.githubusercontent.com/HealerJean/HealerJean.github.io/master/blogImages/1558686754766.png)]

1.2、Print 接口


public interface  Print {

      void printWeak();

      void printStrong();
}

1.3、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();
    }
}

1.4、测试Main

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


        Print p = new AdapterPrintBanner("Hello");

        p.printWeak();

        p.printStrong();

    }
}

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

3.1、Print 抽象类

public interface  Print {

      void printWeak();

      void printStrong();
}

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();
    }
}

3.2、测试Main

public class Main {

    public static void main(String[] args) {

        Print p = new AdapterPrintBanner("Hello");

        p.printWeak();

        p.printStrong();
    }
}

4、现在的情况

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

5、UML

4…1、 类适配器模式(使用继承)

1558689013642

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

[外链图片转存失败(img-LrxLbqlj-1566550452737)(https://raw.githubusercontent.com/HealerJean/HealerJean.github.io/master/blogImages/1558689101738.png)]

5、Adapter登场角色

5.1、Target(对象)

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

5.2、Client(请求者)

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

5.3、Adapter (适配器 )

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

5.4、Adaptee(被适配)

该角色是被适配的角色

在继承中是被继承 、在委托中是被聚合



感兴趣的,欢迎添加博主微信

哈,博主很乐意和各路好友交流,如果满意,请打赏博主任意金额,感兴趣的在微信转账的时候,备注您的微信或者其他联系方式。添加博主微信哦。

请下方留言吧。可与博主自由讨论哦

微信 微信公众号 支付宝
微信 微信公众号 支付宝
posted @ 2019-08-23 16:55  HealerJean  阅读(146)  评论(0编辑  收藏  举报