适配器模式(Adapter Pattern)

加个"适配器"以便于复用

1.使用情况

在程序世界中,经常存在现有的程序无法直接使用,需要适当的变化才能使用.这种用于填补俩个程序之间差异的设计模式就是适配器模式。

适配器模式分为以下俩种:

  • 类适配器模式(使用继承的适配器)->类和接口
  • 对象适配器模式(使用委托的适配器)->俩个类

2.类适配器

在这里插入图片描述

程序类图
在这里插入图片描述

Banner类

/**
 * @author Jay
 * @date 2019/5/23 22:52
 * @description
 */
public class Banner {
    private String string;

    public Banner(String string) {
        super();
        this.string = string;
    }

    /**
     * 括号方式
     */
    public void showWithParen() {
        System.out.println("(" + string + ")");

    }

    /**
     * 星号方式
     */
    public void showWithAster() {
        System.out.println("*" + string + "*");
    }
}

Print接口

/**
 * @author Jay
 * @date 2019/5/23 22:54
 * @description 定义打印接口
 */
public interface Print {
    /**
     * 定义打印方式
     */
    void printWeak();

    /**
     * 不同的打印方式
     */
    void printStrong();
}

PrintBanner类:适配器,实现接口又继承类,可以使用俩者的方法.

/**
 * @author Jay
 * @date 2019/5/23 22:55
 * @description 适配器,实现接口又继承类,可以使用俩者的方法.
 */
public class PrintBanner extends Banner implements Print {
    /**
     * 适配器对象
     */
    public PrintBanner(String string) {
        super(string);
        // 父类只有一个构造器则子类只能调用父类唯一构造器
        // 需把值传入
    }

    @Override
    public void printWeak() {
        //有个隐式的super可以调用父类方法
        super.showWithParen();
    }

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

Main

/**
 * @author Jay
 * @date 2019/5/23 23:01
 * @description
 */
public class Main {
    /**
     * 测试类
     */
    public static void main(String[] args) {
        //接口引用接收其实现类对象
        Print p = new PrintBanner("Hello");
        //只能调用从接口实现的方法以及子类自己的方法,无法调用父类.
        p.printStrong();
        p.printWeak();
    }
}

Banner类中具体方法实现细节对Main完全隐藏,Main不知道PrintBanner中如何实现,这样就可以在不对Main类修改的情况下改变PrintBanner的具体实现细节。


3.对象适配器(使用委托)

在这里插入图片描述
Banner类

/**
 * @author Jay
 * @date 2019/5/23 22:52
 * @description
 */
public class Banner {
    private String string;

    public Banner(String string) {
        super();
        this.string = string;
    }

    /**
     * 括号方式
     */
    public void showWithParen() {
        System.out.println("(" + string + ")");

    }

    /**
     * 星号方式
     */
    public void showWithAster() {
        System.out.println("*" + string + "*");
    }
}

Print类

/**
 * @author Jay
 * @date 2019/5/23 23:13
 * @description
 */
public abstract class Print {
    public abstract void printWeak();
    public abstract void printStrong();
}

PrintBanner类

/**
 * @author Jay
 * @date 2019/5/23 23:13
 * @description
 */
public class PrintBanner extends Print {
    /**
     * 使用组合将俩个类方法都可以调用
     */
    private Banner banner;

    public PrintBanner(String string) {
        // 构造函数创建Banner对象
        this.banner = new Banner(string);
    }

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

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

Main

public class Main {
    //测试类
    public static void main(String[] args) {
        Print p = new PrintBanner("Hello");//接口引用接收其实现类对象
          //只能调用从接口实现的方法以及子类自己的方法,无法调用父类.                                 
        p.printStrong();
       p.printWeak();   
    }
}

4.适配器的各种角色

Target(对象)

该角色负责定义所需的方法.示例中Print接口(被实现)和Print类(被委托)

ex:笔记本电脑工作所需12v电源

Clint(请求者)

该角色负责将Target所定义的方法具体实现.示例中的Main类.

ex:笔记本电脑

Adaptee(被适配)

持有既定方法的角色 ,Banner类

ex:220v电源
Adapter(适配器)

使用Adaptee角色的方法来满足Target角色的需求.PrintBanner类

ex:电源适配器

适配器实现的俩种模式:

使用继承:

在这里插入图片描述

使用委托:

在这里插入图片描述

可以将稳定代码,封装好的代码重复利用,用适配器进行组装,从而生成新的类,方便代码的排查.


To GitHub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值