前言
说实话,设计模式相关的书和帖子也看了不少了。每次看完的感觉都是:设计模式也不难理解,觉得自己掌握了。凡是就怕有但是啊,下回别人问起来或者准备面试的时候。嗯。。。感觉也就记得几个名词而已。摊手。所以,趁着今天时间比较充裕,先撸一遍适配器模式。
概念
在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
从模式的名字适配器来看,生活中我们接触的比较多的就时电源适配器,而它是一种供电电源转换装置,工作原理是将交流输入转换为直流输出。
类比电源适配器,适配器模式就比较好理解了。就是把已存在的接口,包装一下使之适应客户端需求。
代码示例
举一个生活中的例子吧
比方说有一个程序员,每天上班都骑摩托车上下班。有一天呢,下班的时候他发现摩托车坏了骑不了了。而且当时天已经很晚,996嘛都懂得。他一想索性骑共享单车回家吧,正好锻炼身体。
这种情况下客户端就是这个coder,摩托车就是一个已经有实现的类。自行车就是一个接口。现在coder需要用骑摩托的技巧去骑自行车(当然其中还是有差异的),那么现在就可以用一个适配器去包装一下
创建Motorcycle
/**
* @author :wang.j.f
* @description:
* @date :Created in 2021/5/1 16:51
* @modified By:
* @version: 1.0$
*/
public class Motorcycle {
public void drive(){
System.out.println("---距离到家还要10分钟");
System.out.println("---距离到家还要5分钟");
System.out.println("---到家啦");
}
}
创建接口类Bicycle
/**
* @author :wang.j.f
* @description:TODO
* @date :Created in 2021/5/1 16:54
* @modified By:
* @version: $
*/
public interface Bicycle {
public void ride();
}
创建自行车适配器类 BicycleAdapter 继承 Motorcycle 并实现了 Bicycle
/**
* @author :wang.j.f
* @description:TODO
* @date :Created in 2021/5/1 16:58
* @modified By:
* @version: 1.0$
*/
public class BicycleAdapter extends Motorcycle implements Bicycle{
@Override
public void ride() {
drive();
}
}
创建Coder类 coder 需要一个自行车骑回家
/**
* @author :wang.j.f
* @description:TODO
* @date :Created in 2021/5/1 16:55
* @modified By:
* @version: 1.0$
*/
@NoArgsConstructor
public class Coder {
public Coder(Bicycle bicycle) {
this.bicycle = bicycle;
}
private Bicycle bicycle;
private void goHome() {
bicycle.ride();
}
public static void main(String[] args) {
Coder coder = new Coder(new BicycleAdapter());
coder.goHome();
}
}
上面的BicycleAdapter 是继承了Motercycle 这种适配方式叫 类的适配器模式。
还有一种叫对象适配器模式
对象适配器模式
/**
* @author :wang.j.f
* @description:TODO
* @date :Created in 2021/5/1 16:58
* @modified By:
* @version: 2.0$
*/
public class BicycleAdapter implements Bicycle{
public BicycleAdapter() {
this.motorcycle = new Motorcycle();
}
private Motorcycle motorcycle;
@Override
public void ride() {
motorcycle.drive();
}
}
两种实现方式对比
类的适配器模式:
优点:使用方便,代码简化。不需要引入额外的对象
缺点:耦合性高,灵活性低
对象适配器模式:
优点:低耦合,灵活性高 采用对象组合方式,是动态的组合方式
缺点:使用复杂 需要引入对象
建议尽量使用对象的适配器模式,多用合成/聚合 少用继承
网友评论