adapter pattern--适配器模式

adapter pattern,又称wrapper(包装) pattern
在软件系统中,由于应用环境的变化,常常需要将一些现存的对象放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。Adapter设计模式就是为了应对这种迁移的变化,以使客户系统既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口。
“Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.” ---GoF
 
将一个类的接口转化为客户端所期望的接口。适配器模式使得原本拥有不兼容接口的类能一起“工作”。--GoF
 
适配器一般有两种形式:
第一种形式

该形式是采用继承方式实现复用Adaptee接口。
 
实例解析:
    例如有一个人看电视,现在想换台了,有一个换台请求的接口,而电视机也可以接收信号换台,它拥有一个接收信号的接口,现在很清楚这两个类之间不兼容,我们需要一个适配器来使得这两个拥有不兼容接口的类一起工作。采取继承复用的方式。
复制代码
 1 class IdeaChange
 2 {
 3     public:
 4         virutal void RequestChange( )=0;
 5 };
 6 class Tv
 7 {
 8     public:
 9         void AcceptRequest( );  
10 };
11 void Tv::AcceptRequest( )
12 {
13     std::cout<<"Accept the request of ChannelChange"<<std::endl; 
14 }
15 class Adapter:public IdeaChange,private Tv
16 {
17     public:
18         void RequestChange( );
19 };
20 void Adapter::RequestChange( )
21 {
22     std::cout<<"Request for change channel"<<std::endl;
23     AcceptRequest( );
24 }
25 
26 int main(int argc,char ** argv)
27 {
28   Adapter a;
29   a.RequestChange( );
30   return 0;  
31 }
复制代码

 

运行结果

第二种形式

该形式是采用组合方式实现复用Adaptee接口。
还是上面一样的实例
复制代码
 1 class IdeaChange
 2 {
 3     public:
 4         virutal void RequestChange( )=0;
 5 };
 6 class Tv
 7 {
 8     public:
 9         void AcceptRequest( );  
10 };
11 void Tv::AcceptRequest( )
12 {
13     std::cout<<"Accept the request of ChannelChange"<<std::endl; 
14 }
15 class Adapter:public IdeaChange
16 {
17     public:
18         Adapter( );
19         ~Adapter( );
20         void RequestChange( );
21     private:
22         Tv* t;
23         
24 };
25 Adapter::Adapter( )
26 {
27     t=new Tv( );
28 }
29 Adapter::~Adapter( )
30 {
31     delete t;
32 }
33 void Adapter::RequestChange( )
34 {
35     std::cout<<"Request for change channel"<<std::endl;
36     t->AcceptRequest( );
37 }
38 
39 int main(int argc,char ** argv)
40 {
41   Adapter a;
42   a.RequestChange( );
43   return 0;  
44 }
复制代码

 

运行结果为

posted @   胡佳180815  阅读(2269)  评论(11编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2009-12-16 SQL注入(二)
点击右上角即可分享
微信分享提示