当前位置: 首页 > news >正文

Adapter Patterm简单随笔

         Adapter 模式:如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口 。

        目的:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。


        对象适配器是采用对象组合而不是使用继承。对比以上两种适配方式,在类适配方式中,我们得到的适配器类具有它所继承的父类的所有的行为,同时也具有接口的所有行为,这样其实是违背了面向对象设计原则中的类的单一职责原则,而对象适配器则更符合面向对象的思想,所以在实际应用中不太推荐类适配这种方式。


        Adapter模式在.NET Framework中的一个最大的应用就是COM Interop。COM Interop就好像是COM和.NET之间的一条纽带,一座桥梁。

我们知道,COM组件对象与.NET类对象是完全不同的,但为了使COM客户程序象调用COM组件一样调用.NET对象,使.NET程序象使用.NET对象一样使用COM组件,微软在处理方式上采用了Adapter模式,对COM对象进行包装,这个包装类就是RCW(Runtime Callable Wrapper)。RCW实际上是runtime生成的一个.NET类,它包装了COM组件的方法,并内部实现对COM组件的调用。

       原先存在的操作集合:

 

 1  using  System;
 2  using  System.Collections.Generic;
 3  using  System.Text;
 4 
 5  namespace  AdapterPatternSam
 6  {
 7       public   abstract   class  Operater
 8      {
 9           public   abstract   void  DoSometing();
10      }
11  }
12 
13  using  System;
14  using  System.Collections.Generic;
15  using  System.Text;
16 
17  namespace  AdapterPatternSam
18  {
19       public   class  OperaterA:Operater
20      {
21           public   override   void  DoSometing()
22          {
23              Console.WriteLine( " ***************operater A!!!******************* " );
24              Console.WriteLine();
25          }
26      }
27  }
28 
29  using  System;
30  using  System.Collections.Generic;
31  using  System.Text;
32 
33  namespace  AdapterPatternSam
34  {
35       public   class  OperaterB:Operater 
36      {
37           public   override   void  DoSometing()
38          {
39               // throw new Exception("The method or operation is not implemented.");
40              Console.WriteLine( " ***************operater B!!!******************* " );
41              Console.WriteLine();
42          }
43      }
44  }
45 

 

         结构已经稳定,但是却与现在的环境却有很大差别,需要引用适配器来调解彼此之间的差别,使现在的环境能够调用原有的稳定结构。

         相对于类适配器而言:继承原有子类的所有操作的时候,还需要继承其他相关接口,所需要的代码编写量是很大的,并且违背了类的单一职责原则,采用对象适配器设计模式,采用的面向对象的思想进行设计。

         适配器代码如下:

 

 1  using  System;
 2  using  System.Collections.Generic;
 3  using  System.Text;
 4 
 5  namespace  AdapterPatternSam
 6  {
 7       interface  IAdaperater
 8      {
 9           void  Work();
10      }
11  }
12 
13 
14  using  System;
15  using  System.Collections.Generic;
16  using  System.Text;
17 
18  namespace  AdapterPatternSam
19  {
20       public   class  Adaperater:IAdaperater
21      {
22           // 采用对象组合 相对于类适配器而已,具有更好的可扩展性和维护性
23           private  Operater _operater;
24 
25           public  Adaperater(Operater operater) 
26          {
27               this ._operater  =  operater;
28          }
29 
30           #region  IAdaperater 成员
31 
32           public   void  Work()
33          {
34               // throw new Exception("The method or operation is not implemented.");
35              _operater.DoSometing();
36 
37          }
38 
39           #endregion
40      }
41  }
42 

 


客户端操作如下:

 

 1  using  System;
 2  using  System.Collections.Generic;
 3  using  System.Text;
 4 
 5 
 6 
 7 
 8  namespace  AdapterPatternSam
 9  {
10       class  Program
11      {
12           static   void  Main( string [] args)
13          {
14               // 对象适配器是采用对象组合而不是使用继承,相对于类适配器而已,具有更好的松耦合和面向对象思想
15              IAdaperater adaperater  =   new  Adaperater( new  OperaterA());
16              adaperater.Work();
17 
18              Console.ReadLine();
19 
20 
21              adaperater  =   new  Adaperater( new  OperaterB());
22              adaperater.Work();
23              Console.ReadLine();
24 
25          }
26      }
27  }

 

 

操作结果如下:

 

********************************************************************************

源代码下载:/Files/jasenkin/AdapterPatternSam.rar

相关文章:

  • 雨林木风推出的8G免费U盘
  • 《软件随想录》读后感
  • 全员营销制造3G繁华表象
  • 慧悟
  • 【转】Tokyocabinet/Tokyotyrant文档大合集
  • openssl的vs/vc工程配置与make
  • 软件工程之感想
  • TRUNCATE TABLE 删除表中的所有行,而不记录单个行删除操作
  • GRE OVER IPSEC的配置方法
  • 互联网软件应用与开发
  • PHP面试题及答案(一)
  • ASP基础教程:ADO存取数据库时如何分页显示
  • ASP.NET4.0新的%: %语法用于HTML Encoding
  • Ubuntu 9.10 /etc/apt/sources.list
  • 现代机房的发展趋势
  • 【剑指offer】让抽象问题具体化
  • Angular 2 DI - IoC DI - 1
  • AWS实战 - 利用IAM对S3做访问控制
  • Bytom交易说明(账户管理模式)
  • CSS盒模型深入
  • Git学习与使用心得(1)—— 初始化
  • js ES6 求数组的交集,并集,还有差集
  • magento 货币换算
  • spark本地环境的搭建到运行第一个spark程序
  • SQLServer之创建显式事务
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 对象管理器(defineProperty)学习笔记
  • 那些年我们用过的显示性能指标
  • 首页查询功能的一次实现过程
  • 网页视频流m3u8/ts视频下载
  • 新版博客前端前瞻
  • 硬币翻转问题,区间操作
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • $.ajax()
  • (11)MATLAB PCA+SVM 人脸识别
  • (3)选择元素——(17)练习(Exercises)
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Oracle)SQL优化技巧(一):分页查询
  • (八)Flask之app.route装饰器函数的参数
  • (备忘)Java Map 遍历
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (二)丶RabbitMQ的六大核心
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (十八)三元表达式和列表解析
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)http-server应用
  • (转)visual stdio 书签功能介绍
  • (转)详解PHP处理密码的几种方式
  • *1 计算机基础和操作系统基础及几大协议