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

适配器模式(Adapter)

1  概述
遇到这样的问题:需要用到已有的功能,功能的数据和行为都是正确的,但是功能的调用繁杂并要在多个地方调用。在正常的思维下,我们将功能的调用写在一个公共类的一个方法中,这样我们就已经达到了隔离已有复杂功能目的。但这样做有如下缺点:
1>如果这个类有多个公开的方法,则不能对这个类进行统一的管理;
2>如果这个类中的方法相互依赖很强,那么写公共方法也会比较烦;
最后,我们用OO的语言开发,应该以OO的思想来解决这个问题。上述的问题,通过大师们的总结,已经形成一个统一的解决模式:适配器模式;
2  GOF中的定义
2.1 意图:
  将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。——GOF
2.2 对象适配器结构图

2.3 说明:
Adaptee:第三方组件或旧系统中复杂的类;
Target:新系统所希望的接口;
Adapter:将Adaptee转换成Target。

3 示例实现

View Code
    /// <summary>
    /// 旧系统中的已有的类
    /// </summary>
    public class Adaptee
    {
        public void SendMail(string mailtitle,string mailAddress) { }
    }

    /// <summary>
    /// 客户代码希望的接口
    /// </summary>
    public interface ISendMail
    {
        void SendMail();
    }

    /// <summary>
    /// 适配器类
    /// </summary>
    public class Adapter:ISendMail
    {
        protected Adaptee adaptee;
        public Adapter(Adaptee ada) 
        {
            this.adaptee = ada;
        }

        private string tilte;

        public string Tilte
        {
            get { return tilte; }
            set { tilte = value; }
        }

        private string address;

        public string Address
        {
            get { return address; }
            set { address = value; }
        }
        public void SendMail()
        {
            adaptee.SendMail(Tilte, Address);
        }
    }

4 总结
总的来说,适配器模式就是在不改变原有代码的前提下,将不兼容或复杂的接口,转换成我们需要的接口。

转载于:https://www.cnblogs.com/dataadapter/archive/2012/09/11/2679501.html

相关文章:

  • GBK
  • 学习ADO时总结的一些经验
  • sysconf zz
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • Linux的nm查看动态和静态库中的符号
  • 产品验证环节的失语现象
  • LDR指令的应用
  • iptables应用
  • 天啊,原来计算机就是佛,信则灵
  • 如何利用HTTP缓存提高网页性能
  • mysql体系架构
  • 运维自动化之使用Cobbler自动化安装系统与FAQ
  • 凯易讯的笔试
  • 高清电影下载推荐
  • Linux系统启动5个阶段
  • 《深入 React 技术栈》
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Android优雅地处理按钮重复点击
  • chrome扩展demo1-小时钟
  • const let
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Vim 折腾记
  • 缓存与缓冲
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 详解NodeJs流之一
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • $GOPATH/go.mod exists but should not goland
  • (C语言)fread与fwrite详解
  • (NSDate) 时间 (time )比较
  • (二)c52学习之旅-简单了解单片机
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (南京观海微电子)——I3C协议介绍
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (三)elasticsearch 源码之启动流程分析
  • (转)创业的注意事项
  • (转载)PyTorch代码规范最佳实践和样式指南
  • ... 是什么 ?... 有什么用处?
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net 生成二级域名
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .net解析传过来的xml_DOM4J解析XML文件
  • .NET实现之(自动更新)
  • 。Net下Windows服务程序开发疑惑
  • /etc/fstab 只读无法修改的解决办法
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @Not - Empty-Null-Blank
  • @property @synthesize @dynamic 及相关属性作用探究
  • @RestController注解的使用
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)