极速理解设计模式系列:6.适配器模式(Adapter Pattern)

四个角色:目标抽象类角色(Target)、目标对象角色(Adapter)、源对象角色(Adaptee)、客户端角色(Client)

        目标抽象类角色(Target):定义需要实现的目标接口

        目标对象角色(Adapter):调用另外一个源对象,并且转换(适配)为需要的目标对象。

        源对象角色(Adaptee):因为提供的功能不能满足现状,需要转换的源对象。

        客户端角色(Client):调用目标对象,对源对象进行加工。

         实现思路:首先取得需要转换的源对象,然后通过Adapter对源对象进行加工得到目标对象。

 类图:

        应用场景:在第三方类库中有一个源对象可以实现判断用户是否属于成人、是几个字的名字,但是需要的功能是显示用户信息,且不能更改第三方类库。

        分析:现在的系统中需要的是显示用户信息的功能,在这里我们通过适配器模式调用第三方的对象,在目标对象中显示用户信息处理,并提供接口给客户端。

        下面我们在控制台程序去演示一下如何使用Adapter Pattern:

        一、目标抽象类角色(Target)

    //Target(目标抽象类角色)
interface ITarget
{
void ShowInfo();
}

        二、目标对象角色(Adapter)

复制代码
    //Adapter(目标对象角色)
public class TargetInfoAdapter:ITarget
{
SourceInfo sinfo;
public TargetInfoAdapter(SourceInfo sourceinfo)
{
this.sinfo = sourceinfo;
}
public void ShowInfo()
{
Console.WriteLine(sinfo.Name
+ ":" + sinfo.Age + "" + sinfo.IsAdult() + " " + sinfo.NumberOfName());
}
}
复制代码

        三、源对象角色(Adaptee)

复制代码
    //Adaptee(源对象角色)
public class SourceInfo
{
public string Name { get; set; }
public int Age { get; set; }
public string IsAdult()
{
return Age > 17 ? "成年" : "未成年";
}
public string NumberOfName()
{
return Name.Length.ToString() + "个字名!";
}
}
复制代码

        四、客户端角色(Client)

复制代码
    //Client(客户端角色)
class Program
{
static void Main(string[] args)
{
//取得源对象
SourceInfo sinfo = new SourceInfo() { Name="小明",Age=15 };
//通过适配器转化源对象为目标对象。
ITarget target =new TargetInfoAdapter(sinfo);
target.ShowInfo();
Console.ReadLine();
}
}
复制代码

        如需源码请点击 AdapterPattern.rar 下载。


本文转自程兴亮博客园博客,原文链接:http://www.cnblogs.com/chengxingliang/archive/2011/09/15/2173195.html,如需转载请自行联系原作者


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark(二): 内存管理

2019独角兽企业重金招聘Python工程师标准>>> Spark 作为一个以擅长内存计算为优势的计算引擎,内存管理方案是其非常重要的模块; Spark的内存可以大体归为两类:execution和storage,前者包括shuffles、joins、sorts和agg…

多播、组播、广播优缺点分析

2019独角兽企业重金招聘Python工程师标准>>> 单播、多播和广播单播”(Unicast)、“多播”(Multicast)和“广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究…

LOFTERD18B542F16FF685FD684F427B4…

2019独角兽企业重金招聘Python工程师标准>>> 验证 转载于:https://my.oschina.net/jinhengyu/blog/1572124

Source Map调试压缩后代码

在前端开发过程中,无论是样式还是脚本,运行时的文件可能是压缩后的,那这个时候调试起来就很麻烦。 这个时候,可以使用Source Map文件来优化调试,Source Map是一个信息文件,里面储存着原代码位置信息&#x…

两台电脑间大量数据拷贝的快捷方法

可能大家会遇到需要将一台电脑里的数据拷贝到另外一台电脑,最常用的方法是用u盘或移动硬盘等存储设备来拷贝,这样速度慢,而且可能拷贝多次才能将数据拷贝完。现提供一种方法,就是通过windows 的文件共享来实现。通过千兆网线直接连…

工作所用的模块回滚脚本

俗话说的好:“真男人从来不回滚”,但是家中常备一个回滚脚本也是很有必要的,我所在公司的服务器模块名都是在初始化的时候写进/etc/role_install这个文件里,如下图的这个服务器就是fss服务器: 再比如下面这个服务器&am…

Quartus II 8.1 详解--有图---图片详解 【1讲】

Quartus II 8.1 详解--有图---图片详解 看图片比较清楚,比文章清楚的多 本文转自 zhangguangyi 51CTO博客,原文链接http://blog.51cto.com/bosszhang/808019:

shell下的进度条和最大最小平均值

进度条 C语言下的进度条参考我原来的一篇blog->进度条 1234567891011121314151617181920212223function proc() {i0 str arr(| / - \\) index0 while [ $i -le 100 ] do printf "[%-101s][%d%%][%c]\r" "$str" "$i" "${arr[$index]}&qu…

Linux系统管理初步(七)系统服务管理、chkconfig与systemd 编辑中

Linux系统本身包含了很多服务,CentOS6之前系统的服务用SysV控制,CentOS7改为systemd控制 一、chkconfig服务管理机制 简而言之,chkconfig就是CentOS6以前用来控制系统服务的工具, 常用方法举例 chkconfig --list #列出所有的系统服…

窗体间传递数据

前言 做项目的时候,winfrom因为没有B/S的缓存机制,窗体间传递数据没有B/S页面传递数据那么方便,今天我们就说下winfrom中窗体传值的几种方式。 共有字段传递 共有字段传递实现起来很方便,就是在窗体类中加个共有字段属性&#xff…

微信抢房软件开发

2019独角兽企业重金招聘Python工程师标准>>> 这两年楼市真可谓是一个"火“字难以形容 经历了长沙两次开盘,都没有抢到,目前还没有买到房子,说说我的悲剧吧,让大伙都开心开心 第一次抢房是今年4月份长沙万科金域国…

11.13 模10计数器设计

.新建一个工程 Family:FLEX10K Available device:EPF10K20TC144-3 2.设置lpm_counter宏单元参数并连接引脚 连接引脚的时候要注意的是,向量线的连接。 3.时序仿真 检查无误后进行下一步 4.载入7448并进行引脚连接 5.分配管脚 再次编译&#x…

使用valueOf前必须进行校验

每个枚举都是java.lang.Enum的子类,都可以访问Enum类提供的方法,比如hashCode(),name(),valueOf()等..... 其中valueOf()方法会把一个String类型的名称转变为枚举项,也就是枚举项中查找出字面值与该参数相等的枚举项,虽然这个方法很简单,但是JDK却做了一个对于开发人员来说并不…

多IDC GSLB的部署

之前已经介绍过GSLB的实现原理,这里再向大家讲述一下GSLB经常遇到的部署方式,多IDC的部署。很多大型的企业或业务容灾要求非常高的客户都会部署有多个异地的数据中心,以保证其业务的“全天候”不间断的正常运行,而要整合多个IDC的…

信息系统开发平台OpenExpressApp:【OpenTest】 之 语法及其使用介绍

在OpenTest 之 运行环境准备中介绍了运行自动化测试需要做的一些准备工作,本篇将继续给大家介绍OpenTest的脚本语法以及使用方法,通过学习后读者应该能够开始动手编写UI自动化测试脚本了。 关键字驱动测试 在学习语法之前,需要了解一下关键字…

Oracle 10g 高级安装图文教程(二)

第八步:为了简便起见(工作中肯定不安全),选择“所有的帐户都是用同一个口令”,并输入口令,点击“下一步”:本文转自 victoryan 51CTO博客,原文链接:http://blog.51cto.com/victoryan…

Gram matrix 格拉姆矩阵

2019独角兽企业重金招聘Python工程师标准>>> Gram matrix 度量各个维度自己的特性以及各个维度之间的关系。 来自:https://www.zhihu.com/question/49805962?fromprofile_question_card 由感知机(对偶感知机中需要计算样本点两两之间的内积和…

MySQL日常应用操作记录

1.知道一个字段名,怎样查到它在数据库里的哪张表里? USE Information_schema;SELECT TABLE_NAME FROM COLUMNS WHERE COLUMN_NAME字段名称; MySQL中查看库表字段信息都在information_schemal中,获取数据字典等信息都要通过这个视图。 如&…

如果只做前端验证的话,谈jjdd.com的看照片功能。

如果你在上海,并且坐过地铁的话,你肯定知道jjdd.com。 这个网站和百合,世纪佳缘类似,都是交朋友的性质。 在jjdd.com中有个很重要的功能:如果你上传的照片比你想看的人少的话,你是不能看她的照片的。 例如如…

升级PowerShell至4.0版本

为了更好的使用Cmder v1.2,不得不升级PowerShell为4.0。 不知道Cmder的,可以点击这里:https://github.com/cmderdev/cmder 和 逆天神器 cmder。 Powershell是运行在Windows机器上实现系统和应用程序管理自动化的命令行脚本环境。 需要.NET环境…