信阳住房和城乡建设厅网站,php网站开发实例视频,网络营销比较成功的企业,怎么自己做音乐网站适配器是一种结构型设计模式#xff0c;用于将一个接口转换为另一个客户端所需要的接口。该模式通过创建一个适配器对象#xff0c;使不兼容的接口可以协同工作。
适配器模式主要分为三个角色#xff1a;适配器类、目标类、适配者类。
适配器模式分为对象适配器和类适配器…适配器是一种结构型设计模式用于将一个接口转换为另一个客户端所需要的接口。该模式通过创建一个适配器对象使不兼容的接口可以协同工作。
适配器模式主要分为三个角色适配器类、目标类、适配者类。
适配器模式分为对象适配器和类适配器。
对象适配器是基于组合实现而类适配器通过多继承方式实现。在类适配器模式中适配器类即继承目标类又继承适配者类从而能够调用适配者类的方法并将其适配到目标类身上。相比之下对象适配器更加灵活因为它是继承目标类、定义适配者对象在目标类方法中调用适配者对象的方法这种方法支持我们可以适配多个适配者类也就是定义多个适配者类所以更加灵活。
主要区别包括
1、实现方式对象适配器使用对象组合composition实现适配器功能而类适配器使用多重继承multiple inheritance实现适配器功能。
2、关系对象适配器通过持有适配者对象的引用来连接适配器与适配者类适配器通过同时继承目标类和适配者类来连接适配器与适配者。
3、灵活性对象适配器更加灵活可以适配多个适配者类并且可以动态切换适配者类适配器在编译时就确定了适配者类无法在运行时动态切换适配者。
因为类适配器是在编译时确定的所以基本没有优点我们这里举一个对象适配器的例子。
假设我们现在有一个模拟动物各种行为的机器人它定义了叫喊和奔跑两种方法我们现在希望不修改现有代码的基础上让机器人模仿狗的叫声和跑步姿势。 #include iostream
#include memory// 目标抽象类Robot
class IRobot
{
public:virtual ~IRobot() {}virtual void Cry() 0;virtual void Run() 0;
};// 适配者类 狗
class Dog
{
public:void Wang(){std::cout 狗叫 std::endl;}void Run(){std::cout 狗跑 std::endl;}
};// 适配器类
class DogAdapter: public IRobot
{
public:DogAdapter(std::shared_ptrDog _dog): dog_(_dog){}virtual void Cry() override{std::cout 机器人模仿: ;if (dog_)dog_-Wang();}virtual void Run() override{std::cout 机器人模仿: ;if (dog_)dog_-Run();}private:std::shared_ptrDog dog_;
};测试
void TestAdapter()
{std::shared_ptrIRobot robot std::make_sharedDogAdapter(std::make_sharedDog());robot-Cry();robot-Run();
}输出
机器人模仿: 狗叫
机器人模仿: 狗跑为了实现这个示例我们创建了一个抽象目标类 IRobot定义了叫和跑两种方法。创建了一个具体适配者类 Dog同样实现了叫和跑两种方法创建了一个适配器类 DogAdapter继承IRobot并且定义一个适配者对象重写这两种方法在这两种方法里调用适配者对象的叫和跑两种方法到达机器人模拟狗叫和狗跑的目的。
适配器模式遵循以下设计原则
1、单一职责原则适配器类的主要责任是将不兼容的接口转换为兼容的接口它应该只关注适配工作不涉及其他功能。
2、开闭原则适配器模式允许系统在不修改现有代码的情况下引入新的适配器类以适应不同的适配需要。
优点
1、增加代码的可重用性适配器模式可以重用现有的适配者类无需修改其代码增加系统的可维护性和灵活性。
2、系统的解耦适配器模式将客户端和适配者类进行解耦使得客户端不需要关心具体适配者类的实现细节。而且适配者类发生改变不影响客户端。
3、提高系统的扩展性适配者模式允许在不修改现有代码的情况下增加新的适配器类以适应不同的接口需求。
缺点
1、增加系统的复杂性因为引入了适配器类增加了系统的复杂性对于简单系统可能显得过于繁琐。
2、增加运行时的开销由于适配器需要进行接口转换和数据转换可能会引入一些系统运行时的开销。