适配器模式(Adapter Pattern):或称为包装器(Wrapper)将一个接口转换为客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,
适配器模式包括类适配器和对象适配器。
1、Target(目标抽象类) :目标抽象类定义客户要用的特定领域的接口,可以是个抽象类或接口,也可以是个具体类;
2、Adapter(适配器类):可以调用另一个接口,作为一个转换器,对适配者类和目标抽象类进行适配。
(1)类适配器中,适配器类通过实现Target接口并继承 Adaptee类,使得两者产生联系;
(2)对象适配器类中,适配器类通过继承Target,并关联一个Adaptee对象使两者产生联系;
3、Adaptee (适配者类)
被适配的角色,它定义了一个已经存在的接口,这个接口需要适配。
4、Client(客户类)
针对目标抽象类进行编程,调用在抽象目标类中定义的业务方法。
(1)类适配器模式结构:适配器类Adapter,实现了抽象目标类(Target)接口,并继承了适配者类(Adaptee),在适配器类 的request()方法中调用所继承的适配者类(Adaptee)的SpeaificRequest()方法,实现了适配的目的。
(2)对象适配器模式结构
为了使客户端能够使用适配者类Adapte 的 spcificRequest()方法,需要提供一个适配器类Adapter,这个适配器类包装了一个适配者的实例,从而将客户端和适配者衔接起来,在适配器的request()方法中调用适配者的 spcificRequest()方法。适配器类和适配者类为关联关系。
优点:
缺点:
(1)系统需要使用现有的类,而这些类的接口不符合系统的需求;
(2)数据库链接工具JDBC,使得使用Java语言程序能够与数据库链接,并使用SQL语言来查询和操作数据库。
设计一个可以模拟各种动物的机器人,在机器人中定义了一系列方法,如机器人叫喊 cry()方法,机器人移动方法 move,现在在不修改已有代码的情况下,使得机器人能够像狗一样,叫 wang()和跑 move()
-
- #include
- using namespace std;
- /*目标抽象类RobotTarget 机器人接口*/
- class RobotTarget{
- public:
- RobotTarget(){};
- virtual void cry()=0;
-
- virtual void move()=0;
- ~RobotTarget(){};
- };
-
- /*适配者类 DogAdaptee*/
- class DogAdaptee{
- public:
- DogAdaptee(){}
- virtual void wang()
- {
- cout<<"wang wang"<
- }
-
- virtual void run()
- {
- cout<<"run run"<
- }
- };
-
- /*适配器类 仿生狗 DogAdapter*/
- class DogAdapter: public RobotTarget, public DogAdaptee{
- public:
- DogAdapter(){};
-
- virtual void cry()
- {
- wang();
- }
-
- virtual void move()
- {
- run();
- }
- };
-
- int main()
- {
- //对象适配器
- RobotTarget* robot= new DogAdapter();
-
- robot->cry();
- robot->move();
-
- delete robot;
- return 0;
- }
1.5.2 对象适配器模式
英式插座与中式插座规格不同,如何在不修改英式插座的基础上转换为中式插座。
- #include
- #include
-
- using namespace std;
-
- //目标抽象类 CCnOutlet中式插座
- class CCnOutlet
- {
- public:
- virtual ~CCnOutlet()
- {
-
- }
-
- virtual void Cnplug() = 0;
- };
-
- //适配者类 CEnOutlet
- class CEnOutlet
- {
- public:
- virtual ~CEnOutlet()
- {
-
- }
-
- virtual void Enplug()
- {
- cout << "British socket!" << endl;
- }
- };
-
- //适配器类
- class CCnOutletAdapter : public CCnOutlet
- {
- public:
- CCnOutletAdapter(CEnOutlet *pEnOutlet) : m_pEnOutlet(pEnOutlet){};
-
- virtual ~CCnOutletAdapter(){};
-
- virtual void Cnplug()
- {
- m_pEnOutlet->Enplug();
- cout << "adapter" << endl;
- }
-
- private:
- CEnOutlet *m_pEnOutlet;
- };
-
- int main(int argc, char **argv)
- {
- CEnOutlet *pEnOutlet = new CEnOutlet;
- CCnOutlet *pCnOutlet = new CCnOutletAdapter(pEnOutlet);
-
- //英式插座适配中式插座
- pCnOutlet->Cnplug();
-
- delete pEnOutlet;
- delete pCnOutlet;
-
- return 0;
- }
参考文献:
-
相关阅读:
mybatis执行sql流程
利用Jpom在线构建Spring Boot项目
业界新标杆!阿里开源自研高并发编程核心笔记(2022 最新版)
第6章 Elasticsearch,分布式搜索引擎
javaee spring aop 注解实现
【Node.js+koa--后端管理系统】设计标签创建、查询、接口 | 标签绑定到动态
【老生谈算法】matlab实现LSB算法水印算法源码——LSB算法
黑马苍穹外卖前端求解
Qt自定义菜单
物流工业三防平板实时跟踪货物位置和状态
-
原文地址:https://blog.csdn.net/kenjianqi1647/article/details/126757307