上一节:原型模式(Prototype Pattern) C++
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端期望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作,它通过包装一个已有的类提供一个新的接口,从而使原本由于接口不兼容而不能一起工作的类可以一起工作。
类适配器:使用多重继承对一个接口与另一个接口进行匹配。适配器继承自Adaptee类,并实现Target接口。
对象适配器:使用组合将请求从Client转发给Adaptee。适配器实现Target接口,并在内部持有一个Adaptee实例的引用。
在 Adapter 模式的结构图中可以看到,类模式的 Adapter 采用继承的方式复用 Adaptee的接口,而在对象模式的 Adapter 中我们则采用组合的方式实现 Adaptee 的复用.
类适配器使用继承,直接继承自被适配者(Adapter ),这要求适配器和被适配者之间是“是一个”(is-a)的关系。类适配器可以重写被适配者的行为。
对象适配器使用组合,包含一个被适配者的引用,这表示适配器和被适配者之间是“有一个”(has-a)的关系。对象适配器更加灵活,它允许一个适配器与多个被适配者同时工作,甚至在运行时动态地适配。
假设我们正在开发一个游戏,游戏中有一个旧的敌人接口OldEnemy,它提供了一些基本的功能,比如攻击(attack)和移动(move)。现在,我们希望在游戏中引入一个新的敌人类型,这个新敌人使用了一个不同的接口NewEnemy。我们的目标是让新敌人能够适配旧的敌人接口,以便可以使用旧的游戏逻辑来控制它。
首先定义旧的敌人接口OldEnemy和新的敌人接口NewEnemy,以及一个实现了新接口的新敌人类Alien:
// 旧的敌人接口
class OldEnemy {
public:
virtual void attack() = 0;
virtual void move() = 0;
virtual ~OldEnemy() {
}
};
// 新的敌人接口
class NewEnemy {
public:
virtual void fireWeapon() = 0;
virtual void navigate() = 0;
virtual ~NewEnemy() {
}
};
// 实现了新接口的敌人类
class Alien : public NewEnemy {
public:
void fireWeapon() override {
std::cout << "Alien fires its blaster!" << std::endl;
}
void navigate() override {
std::cout << "Alien moves in zero gravity." << std::endl;
}
};
类适配器使用继承来实现适配,同时继承OldEnemy(目标接口)和Alien(被适配者):
class AlienAdapter : public OldEnemy, private Alien {
public:
void attack() override {
fireWeapon(); // 调用Alien的fireWeapon
}
void move() override {
navigate(); // 调用Alien的navigate
}
};
在这个类适配器中,AlienAdapter通过继承Alien类直接访问其方法,并将它们适配到OldEnemy接口的期望方法上。
对象适配器使用组合来实现适配,它包含一个对新接口对象的引用:
class AlienObjectAdapter : public OldEnemy {
private:
NewEnemy* alien; // 持有一个指向NewEnemy接口的指针
public:
AlienObjectAdapter(NewEnemy* a) : alien(a) {
}
void attack() override {
alien->fireWeapon(); // 通过引用调用Alien的fireWeapon
}
void move() override {
alien->navigate(); // 通过引用调用Alien的navigate
}
};
在这个对象适配器中,AlienObjectAdapter持有一个指向NewEnemy接口(即Alien类实例)的指针,并通过这个引用来调用具体的方法,将NewEnemy接口的方法适配到OldEnemy接口期望的方法上。
更多【c++-适配器模式(Adapter Pattern) C++】相关视频教程:www.yxfzedu.com