青岛市崂山区建设局网站,网站建设的具体过程,网站用户体验存在问题,网页版qq怎么登陆上一节#xff1a;原型模式#xff08;Prototype Pattern#xff09; C 文章目录 0.理论1.组件2.类型3.什么时候使用 1.实践1.基础接口和类2.类适配器实现3.对象适配器实现 0.理论
适配器模式#xff08;Adapter Pattern#xff09;是一种结构型设计模式#xff0c;它允…上一节原型模式Prototype Pattern C 文章目录 0.理论1.组件2.类型3.什么时候使用 1.实践1.基础接口和类2.类适配器实现3.对象适配器实现 0.理论
适配器模式Adapter Pattern是一种结构型设计模式它允许将一个类的接口转换成客户端期望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作它通过包装一个已有的类提供一个新的接口从而使原本由于接口不兼容而不能一起工作的类可以一起工作。
1.组件
目标Target定义客户端使用的与特定领域相关的接口。客户端Client与符合目标接口的对象协同工作。被适配者Adaptee定义一个已经存在的接口这个接口需要适配。适配器Adapter对Adaptee的接口与Target接口进行适配适配器让原本接口不兼容的类可以合作无间。
2.类型 类适配器使用多重继承对一个接口与另一个接口进行匹配。适配器继承自Adaptee类并实现Target接口。 对象适配器使用组合将请求从Client转发给Adaptee。适配器实现Target接口并在内部持有一个Adaptee实例的引用。 在 Adapter 模式的结构图中可以看到类模式的 Adapter 采用继承的方式复用 Adaptee的接口而在对象模式的 Adapter 中我们则采用组合的方式实现 Adaptee 的复用.
类适配器使用继承直接继承自被适配者Adapter 这要求适配器和被适配者之间是“是一个”is-a的关系。类适配器可以重写被适配者的行为。
对象适配器使用组合包含一个被适配者的引用这表示适配器和被适配者之间是“有一个”has-a的关系。对象适配器更加灵活它允许一个适配器与多个被适配者同时工作甚至在运行时动态地适配。
3.什么时候使用
当你想使用某个类但是它的接口与其他代码不兼容时。当你想创建一个可复用的类该类可以与未知的或未来的类即那些接口可能不兼容的类协同工作。当你需要使用几个现有的子类但是子类的接口不符合你的需求且你不能控制这些子类的源代码时。类适配器适合于被适配者不太可能改变的情况而对象适配器则适合于需要适配多个不同的类的情况 1.实践
假设我们正在开发一个游戏游戏中有一个旧的敌人接口OldEnemy它提供了一些基本的功能比如攻击attack和移动move。现在我们希望在游戏中引入一个新的敌人类型这个新敌人使用了一个不同的接口NewEnemy。我们的目标是让新敌人能够适配旧的敌人接口以便可以使用旧的游戏逻辑来控制它。
1.基础接口和类
首先定义旧的敌人接口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;}
};
2.类适配器实现
类适配器使用继承来实现适配同时继承OldEnemy目标接口和Alien被适配者
class AlienAdapter : public OldEnemy, private Alien {
public:void attack() override {fireWeapon(); // 调用Alien的fireWeapon}void move() override {navigate(); // 调用Alien的navigate}
};
在这个类适配器中AlienAdapter通过继承Alien类直接访问其方法并将它们适配到OldEnemy接口的期望方法上。
3.对象适配器实现
对象适配器使用组合来实现适配它包含一个对新接口对象的引用
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接口期望的方法上。
下一节桥接模式Bridge Pattern C