adapter java_适配器模式-Adapter(Java实现)

适配器模式-Adapter

是作为两个不兼容的接口之间的桥梁.

先演示一下不使用适配器时的情况

情景就是家里有插座, 电脑有充电器, 充电器不适用适配器, 直接插到插座上进行充电.

415d4b404e7cc52ae49b73aca2e0b7c8.png 

149002e5b665fbb073a6e16720853342.png 

0ffd8f2d4e3b358596ab69b7fd0d5f13.png

Charger接口

这个世界上有很多的充电器(Charger), 但是抽象出来的话, 都有以下两个功能:

1. 充电(charge)

2. 插在插座上(setElectricSocket)

public interface Charger {

public void charge();

public void setElectricSocket(ElectricSocket electricSocket);

}

ElectricSocket接口

这个世界上有很多不同的插座, 但是抽象出来的话, 都是用来供电的

public interface ElectricSocket {

void supplylEctricity();

}

TwoPlugsCharger类

是一种两片插头的充电器. 如图所示:

415d4b404e7cc52ae49b73aca2e0b7c8.png

public class TwoPlugsCharger implements Charger {

private ElectricSocket electricSocket;

@Override

public void setElectricSocket(ElectricSocket electricSocket) {

this.electricSocket = electricSocket;

}

@Override

public void charge() {

System.out.println("使用[两片]插头充电器");

electricSocket.supplylEctricity();

}

}

TwoPlugsElectricSocket类

是一种两片插孔的插座, 如图所示:

0ffd8f2d4e3b358596ab69b7fd0d5f13.png

public class TwoPlugsElectricSocket implements ElectricSocket {

@Override

public void supplylEctricity() {

System.out.println("使用[两片]插座供电");

}

}

Computer类

public class Computer {

private Charger charger;

public void setCharger(Charger charger) {

this.charger = charger;

}

public void startingUp() {

charger.charge();

}

}

People类

People有电脑, 有充电器, 还可能需要充电器的适配器(适配器之后再提).

我的充电器是两插片的充电器.

public class People {

private Computer computer;

private Charger charger;

private ElectricSocketAdapter adapter;

public People() {

this.computer = new Computer();

this.charger = new TwoPlugsCharger();

}

/**

* 如果需要适配器, 那就在这里设置

*/

public void setAdapter(ElectricSocketAdapter adapter) {

this.adapter = adapter;

}

/**

* @param src 电源, 相对于对于充电器来说

*/

public void connect(ElectricSocket src) {

computer.setCharger(charger);

if (adapter == null) {

System.out.println("不需要适配器");

charger.setElectricSocket(src);

} else {

adapter.setElectricSocket(src);

charger.setElectricSocket(adapter);

}

}

/**

* 使用电脑, 开机

*/

public void useComputer() {

this.computer.startingUp();

}

}

MyHome类

本来用于运行测试.

MyHome代表我家, 假设场景是我家只有一个"两片插口的插座",

在People类里也提到过, 我的充电器也正好是"两插片"的.

所以我的充电器可以在我家直接使用.

代码如下:

public class MyHome {

/**

* 我家只有两片插口的插座

*/

private static final ElectricSocket ELECTRIC_SOCKET = new TwoPlugsElectricSocket();

public static void main(String[] args) {

// 这个People是我

People me = new People();

// 我把电脑连接在我家的插座上

me.connect(ELECTRIC_SOCKET);

// 然后就可以用啦

me.useComputer();

}

}

c71a18f7017d9bc436320a685768199b.png

接下来演示一下使用适配器时的情况

还是笔记本充电器这个例子.

只是有一天去了Hotel, 然后Hotel里的插座全都是三片插座. 我的"两片插头"的充电器无法直接进行使用.如下如所示:

415d4b404e7cc52ae49b73aca2e0b7c8.png

149002e5b665fbb073a6e16720853342.png

23919ee932ba5c9e0b941cdb9391ef28.png

于是乎, 就搞来了一个适配器, 这个适配器的一头可以插进"三片插座"里, 另一头有"两片插孔"

这样就可以让充电器先插到适配器上, 再把适配器插到三片插座就好了.

ThreePlugsElectricSocket类

三片插座, 如下图所示:

23919ee932ba5c9e0b941cdb9391ef28.png

public class ThreePlugsElectricSocket implements ElectricSocket {

@Override

public void supplylEctricity() {

System.out.println("使用[三片]插座供电");

}

}

ElectricSocketAdapter类

之前的两片插头的充电器想要使用上面的三片插座来供电的话, 需要一个中间转换器来进行适配. 那就是适配器了.

这里把适配器抽象为一个借口, 代码如下:

public interface ElectricSocketAdapter extends ElectricSocket {

@Override

void supplylEctricity();

void setElectricSocket(ElectricSocket electricSocket);

}

TwoPlugsAdapterToThree类

这是一个适配器的实现, 用于适配: 两片插头->三片插座

public class TwoPlugsAdapterToThree implements ElectricSocketAdapter {

private ElectricSocket electricSocket;

@Override

public void setElectricSocket(ElectricSocket electricSocket) {

this.electricSocket = electricSocket;

}

@Override

public void supplylEctricity() {

System.out.println("适配器负责将[两片]转为[三片]");

electricSocket.supplylEctricity();

}

}

Hotel类

本来用于运行测试

public class Hotel {

/**

* Hotel只有三片插座

*/

private static final ElectricSocket ELECTRIC_SOCKET = new ThreePlugsElectricSocket();

public static void main(String[] args) {

// 这是我

People me = new People();

// 我提前带上了一个适配器

ElectricSocketAdapter adapter = new TwoPlugsAdapterToThree();

// 装备好适配器

me.setAdapter(adapter);

// 连接充电器等各种线

me.connect(ELECTRIC_SOCKET);

// 开始使用电脑

me.useComputer();

}

}

1f8fa6d87330c5814c2275540f6548d4.png

类关系图如下所示:

4a9656bebc9373b71b49dbb7432768ca.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值