设计模式-适配器模式-Java实现

1、适配器模式

好多人讲适配器模式喜欢用电压举例,众所周知,我们用的电在远距离传输过程中,为了避免损耗过大,使用了高压电传输,但我们家里用的电只有220V,这中间用到了一个叫变压器的东西,它将高压电转换为了家用电;
再比如要用笔记本连接投影仪,但笔记本上只有HDMI接口,没有VGA接口,那么就需要用到HDMI转VGA转换器来帮助实现投影。


转换一词就是适配器模式的精髓所在
考虑这样一种场景,A公司为B公司提供一组接口,现在A公司对这组接口进行了升级,姑且称升级前的接口为1.0版本,升级后的接口为2.0版本,而B公司的程序都是使用1.0版本的接口来编写的,对2.0版本接口不兼容,那么就只有三种办法:

  1. A公司重写接口来兼容【不现实】
  2. B公司使用2.0版本接口重写程序【不现实】
  3. A公司编写可以将2.0版本接口转换为1.0版本接口的适配器【完美!!!】

这就是适配器模式,搭建一座两个不兼容接口之间的桥梁,亦或者说将一个接口包装为另一个接口【ps:适配器模式也叫包装器模式】。
适配器模式有两种:

  1. 类适配器模式
  2. 对象适配器模式

2、实例解析

将上面考虑的场景实例化,假设B公司有如下代码,使用A公司提供的Print类,对输入的Hello进行处理,printWeak函数输出字符串 (Hello),printStrong函数输出字符串 *Hello*:

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

而现在A公司对代码进行了优化,不再提供 Print 类了,相应的功能由 Banner 类来提供,Banner类的代码如下,可以看到 Banner 类中的 showWithParen 以及 showWithAster 两函数分别对应 Print 类中的 printWeak 和 printStrong 两函数:

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

那么B公司的代码就不能兼容A公司的2.0版本的接口了,因此A公司需要提供相应的适配器。

i、类适配器模式

类适配器模式通过继承的方式来实现代码兼容,如下定义Print接口:

public interface Print {
    void printWeak();
    void printStrong();
}

而后新建适配器 PrintBanner 类继承 Banner 类,以及实现 Print接口,这个类的目的在于通过调用父类 Banner 类的函数来实现接口 Print 中所定义的函数,这样B公司就无需修改代码并且还能使用 Banner 类的函数啦。

public class PrintBanner extends Banner implements Print {
    public PrintBanner(String string){
        super(string);
    }
    @Override
    public void printWeak() {
        showWithParen();
    }
    @Override
    public void printStrong() {
        showWithAster();
    }
}

ii、对象适配器模式

对象适配器模式通过委托的方式来实现代码兼容,如下定义抽象类 Print:

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

而后新建适配器 PrintBanner 类继承抽象类 Print,这里可以发现,适配器不再继承 Banner 类,而是在类中建了个 Banner 类的对象,直接操作对象来实现相关操作,这个就是所谓委托的意思:

public class PrintBanner extends Print{
	private Banner banner;
	public PrintBanner(String string){
		this.banner = new Banner(string);
	}
	public void printWeak(){
		banner.showWithParen();
	}
	public void printStrong(){
		banner.showWithAster();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值