深圳专业网站设计公司哪家好,网络营销题库及答案2020,会员登录管理系统,wordpress登录 美化适配器模式#xff08;Adapter Pattern#xff09;是一种结构型设计模式#xff0c;它允许不兼容的接口之间进行合作。适配器模式通过创建一个适配器类来转换一个接口的接口#xff0c;使得原本由于接口不兼容无法一起工作的类可以一起工作。 主要组成部分#xff1a; 目标…适配器模式Adapter Pattern是一种结构型设计模式它允许不兼容的接口之间进行合作。适配器模式通过创建一个适配器类来转换一个接口的接口使得原本由于接口不兼容无法一起工作的类可以一起工作。 主要组成部分 目标接口Target Interface 客户端所期望的接口。 适配器Adapter 实现目标接口并持有一个具体目标对象的引用将请求委托给该对象。 不兼容的接口Adaptee 现有代码中的一个接口它是客户端想要使用的但是不兼容。 客户端Client 需要使用目标接口的代码。
优点
灵活性可以在不改变现有代码的情况下替换或扩展接口。增加可重用性使得不兼容的接口可以通过适配器进行重用。解耦客户端与不兼容的接口解耦使代码更清晰。
使用场景
当你要使用的类存在不兼容的接口时。当你希望使用一些已有的子类而它们的接口与您需要的接口不同时。当你想要创建一个可以与多个不同的接口协同工作的类。
JAVA:
如何将不同类型的电器接口适配到统一的插头接口。
// 1、目标接口 - 电器接口
public interface ElectricSocket {void plugIn();
}
//2、具体目标-美国电器
public class AmericanDevice {public void connect() {System.out.println(连接到美国插座!);}
}// 具体目标-欧美电器
public class EuropeanDevice {public void plug() {System.out.println(链接到欧美到插座);}
}// 适配器1-美国电器适配器
public class AmericanDeviceAdapter implements ElectricSocket{private AmericanDevice device;public AmericanDeviceAdapter(AmericanDevice device){this.device device;}Overridepublic void plugIn() {device.connect();}
}
// 适配器2-欧美适配器
public class EuropeanDeviceAdapter implements ElectricSocket{private EuropeanDevice device;public EuropeanDeviceAdapter(EuropeanDevice device){this.device device;}Overridepublic void plugIn() {device.plug();}
}Test(description 适配器模式)public void adapterTest(){//创建一个美国电器AmericanDevice device new AmericanDevice();ElectricSocket socket new AmericanDeviceAdapter(device);socket.plugIn();//创建一个欧美电器EuropeanDevice device1 new EuropeanDevice();ElectricSocket socket1 new EuropeanDeviceAdapter(device1);socket1.plugIn();}
GO:
假设我现在有一个运维系统需要分别调用阿里云和 AWS 的 SDK 创建主机两个 SDK 提供的创建主机的接口不一致此时就可以通过适配器模式将两个接口统一。
PSAWS 和 阿里云的接口纯属虚构没有直接用原始的 SDK只是举个例子
package adapterimport fmt// ICreateServer 创建云主机
type ICreateServer interface {CreateServer(cpu, mem float64) error
}// AWSClient aws sdk
type AWSClient struct{}// RunInstance 启动实例
func (c *AWSClient) RunInstance(cpu, mem float64) error {fmt.Printf(aws client run success, cpu %f, mem: %f, cpu, mem)return nil
}// AwsClientAdapter 适配器
type AwsClientAdapter struct {Client AWSClient
}// CreateServer 启动实例
func (a *AwsClientAdapter) CreateServer(cpu, mem float64) error {err : a.Client.RunInstance(cpu, mem)if err ! nil {return err}return nil
}// AliyunClient aliyun sdk
type AliyunClient struct{}// CreateServer 启动实例
func (c *AliyunClient) CreateServer(cpu, mem int) error {fmt.Printf(aws client run success, cpu %d, mem: %d, cpu, mem)return nil
}
// AliyunClientAdapter 适配器
type AliyunClientAdapter struct {Client AliyunClient
}// CreateServer 启动实例
func (a *AliyunClientAdapter) CreateServer(cpu, mem float64) error {err : a.Client.CreateServer(int(cpu), int(mem))if err ! nil {return err}return nil
}
package adapterimport testingfunc TestAdapter(t *testing.T) {// 确保 adapter 实现了目标接口var a ICreateServer AliyunClientAdapter{Client: AliyunClient{},}err : a.CreateServer(1.0, 2.0)if err ! nil {return}var w ICreateServer AwsClientAdapter{Client: AWSClient{},}err w.CreateServer(2.0, 3.0)if err ! nil {return}
}