Java设计模式之适配器模式
适配器模式属于结构型模式,适配器模式是将某个类的接口转换成客户端期望的另一个接口表示,主要目的是解决兼容性,让原本因为两个接口不匹配而不能一起工作的两个类可以协同工作。
一、实现适配器模式UML类图
二、适配器模式的工作原理
(1):将一个类的接口转换成另一个接口,让两个不兼容的接口可以相互兼容。
(2):从客户端看不到被适配者。
(3):用户调用适配器转化出来的接口,适配器调用被适配者的接口。
(4):用户直接得到结果。
三、实现适配器模式的步骤
(1):创建两个不兼容的接口ThreeSocket接口和TwoSocket接口
(2):创建两个接口的实现类ThreeSocketImpl和TwoSocketImpl
(3):创建适配器SocketAdapter用于适配不同的接口
(1)创建两个不兼容的接口ElectricityType 接口和Electricity 接口
/**
* @author yly
* @ClassName ThreeSocket
* @Date 2020/2/20 11:43
* @Version 1.0
**/
public interface ElectricityType {
public void ThreeElectricity(String name);
public void TwoElectricity(String name);
}
/**
* @author yly
* @ClassName TwoSocket
* @Date 2020/2/20 11:41
* @Version 1.0
**/
public interface Electricity {
public void electricity(String type,String name);
}
(2)创建ElectricityType 接口的实现类ThreeElectricityTypeImpl 和TwoElectricityTypeImpl
/**
* @author yly
* @ClassName ThreeSocket
* @Date 2020/2/20 11:45
* @Version 1.0
**/
public class ThreeElectricityTypeImpl implements ElectricityType {
@Override
public void ThreeElectricity(String name) {
System.out.println("ThreeElectricityName:" + name);
}
@Override
public void TwoElectricity(String name) {
}
}
/**
* @author yly
* @ClassName TwoSocket
* @Date 2020/2/20 11:44
* @Version 1.0
**/
public class TwoElectricityTypeImpl implements ElectricityType {
@Override
public void ThreeElectricity(String name) {
}
@Override
public void TwoElectricity(String name) {
System.out.println("TwoElectricityName:" + name);
}
}
(3)创建适配器SocketAdapter用于适配不同的接口
/**
* @author yly
* @ClassName SocketAdapter
* @Date 2020/2/20 11:47
* @Version 1.0
**/
public class SocketAdapter implements Electricity{
private ElectricityType electricityType;
public SocketAdapter(String type) {
if (type.equalsIgnoreCase("TwoSocket")) {
electricityType = new TwoElectricityTypeImpl();
} else if (type.equalsIgnoreCase("ThreeSocket")) {
electricityType = new ThreeElectricityTypeImpl();
}
}
@Override
public void electricity(String type, String name) {
if (type.equalsIgnoreCase("TwoSocket")) {
electricityType.TwoElectricity(type);
} else if (type.equalsIgnoreCase("ThreeSocket")) {
electricityType.ThreeElectricity(type);
}
}
}
(4)创建实现了 Electricity接口的实体类。
/**
* @author yly
* @ClassName ElectricityImpl
* @Date 2020/2/20 13:26
* @Version 1.0
**/
public class ElectricityImpl implements Electricity {
private SocketAdapter socketAdapter;
@Override
public void electricity(String type, String name) {
if (type.equalsIgnoreCase("OneSocket")){
System.out.println("ONE SOCKET:"+name);
} else if (type.equalsIgnoreCase("TwoSocket") || type.equalsIgnoreCase("ThreeSocket")){
socketAdapter = new SocketAdapter(type);
socketAdapter.electricity(type, name);
}else {
System.out.println("type类型错误:"+type);
}
}
}
(5)创建demo用于调用适配器
/**
* @author yly
* @ClassName demo
* @Date 2020/2/20 12:26
* @Version 1.0
**/
public class demo {
public static void main(String[] args) {
ElectricityImpl electricity = new ElectricityImpl();
electricity.electricity("OneSocket","红牛");
electricity.electricity("TwoSocket","红牛");
electricity.electricity("ThreeSocket","红牛");
electricity.electricity("FourSocket","红牛");
}
}
(6)运行结果
ONE SOCKET:红牛
TwoElectricityName:TwoSocket
ThreeElectricityName:ThreeSocket
type类型错误:FourSocket
优点:可以将多个没有关联的类一起运行,提高了类的复用。
缺点:过多使用适配器,会使系统变得零乱,不易把握。