简介:适配器模式是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能
使用场景:一个实体对象不仅拥有自身的功能,还需要别的实体的功能。这种情况就需要用到适配器进行连接,使这个实体实现多功能。适配器模式经常使用依赖。
下面的例子是一个“门”和“防盗器材”之间的关系。单纯的“门”只有关和闭的功能,不具有防盗的能力。但是为了安全,我们希望自己家的门不仅仅可以打开和关闭,也需要具有防盗功能。这时,就需要适配器模式了,将门的功能和防盗功能结合在一起,组成“防盗门”。
/**
*门,两个方法:开和关。
*/
public interface Door {
void open();
void close();
}
/**
*防盗
*/
interface AntiTheft{
//只有一个方法:防盗方式
void antiTheafWay();
}
/**
* 防盗有两种不同的设备,一种是监控器,一种是报警器。但都具有防盗的功能。
*/
/**
*监控器,使用监控器防盗
*/
class Monitor implements AntiTheft{
@Override
public void antiTheafWay() {
System.out.println("使用监控器防盗");
}
}
/**
*报警器,使用报警器防盗
*/
class Alarm implements AntiTheft{
@Override
public void antiTheafWay() {
System.out.println("使用报警器防盗");
}
}
/**
*创建一个防盗的适配器,在构造方法中确定使用哪种防盗器材。
*/
class AntiTheftAdapter implements Door{
private AntiTheft antiTheft;
public AntiTheftAdapter(String type) {
if(type!=null&&type.equalsIgnoreCase("Alarm")){
antiTheft=new Alarm();
}
if(type!=null&&type.equalsIgnoreCase("Monitor")){
antiTheft=new Monitor();
}
}
@Override
public void open() {
if(antiTheft!=null){
System.out.print("门打开了");
antiTheft.antiTheafWay();
}
}
@Override
public void close() {
if(antiTheft!=null){
System.out.print("门关闭了");
antiTheft.antiTheafWay();
}
}
}
class RedDoor implements Door{
//适配器作为属性
private AntiTheftAdapter adapter;
@Override
public void open() {
//首先判断有无防盗适配器,如果有,则执行防盗适配器中的open()方法。否则,执行普通方法。
if(adapter!=null){
adapter.open();
}else{
System.out.println("打开没有防盗功能的门");
}
}
@Override
public void close() {
if(adapter!=null){
adapter.close();
}else{
System.out.println("关闭没有防盗功能的门");
}
}
public AntiTheftAdapter getAdapter() {
return adapter;
}
public void setAdapter(AntiTheftAdapter adapter) {
this.adapter = adapter;
}
}
主方法:
public class Main {
public static void main(String[] args) {
RedDoor door=new RedDoor();
AntiTheftAdapter adapter=new AntiTheftAdapter("monitor");
door.setAdapter(adapter);
door.close();
door.open();
System.out.println("------------------------");
RedDoor door2=new RedDoor();
door2.close();
door2.open();
}
}
运行结果:
门关闭了使用监控器防盗
门打开了使用监控器防盗
------------------------
关闭没有防盗功能的门
打开没有防盗功能的门