热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设计模式研究(三)Proxy与Adapter

设计模式研究(一)实例比较TemplateMethod与Strategy设计模式研究(二)-Singleton本文要讨论

设计模式研究(一)实例比较TemplateMethod与Strategy

设计模式研究(二)-Singleton

本文要讨论的是代理和适配器模式。

两种模式理念上的差别

代理(Proxy)模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。

适配器模式(Adapter)把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作。

Proxy的关注点是职能转移,引入代理层代替目标端与调用端进行沟通,而且代理层和目标端具有相同的服务结构(继承同一个接口)。

Adapter的关注点是接口变换,引入一个符合调用端要求的“转化器”实现目标端与调用端的沟通,而且转化器和目标端的服务结构式是不一样的。

实例说明

对于外出打工或外出求学的游子们,大多都有过年回家买车票的经历。下面用代理模式还原一下独具特色的买车票经历。

先抽象一个火车票接口

// 火车票
public interface ITicket
{
string Buy( int price); // 车票不紧张的情况下适用
string Buy( int price,EnumIdentityidentity); // 车票紧张或购票需求量大的情况下适用
}
// 购票人身份
public enum EnumIdentity
{
外出务工人员
= 0 ,
黄牛
= 1 ,
}

下面是火车站售票系统

// 火车站售票系统
public class RailwayStation:ITicket
{
public string Buy( int price)
{
string result = string .Empty;
result
= " 票价: " + price;
return result;
}
public string Buy( int price,EnumIdentityidentity)
{
string result = string .Empty;
if (identity == EnumIdentity.黄牛)
result
= " 票价: " + price;
if (identity == EnumIdentity.外出务工人员)
result
= " 车票已售完 " ;
return result;
}
}

看来“外出务工人员”在车票紧张的情况下从火车站是拿不到车票的,职能上作为火车站售票窗口代理的“黄牛”应用而生了!

// 黄牛售票
public class Scalper:ITicket
{
ITicketTicket
= new RailwayStation();
public string Buy( int price)
{
string result = string .Empty;
result
= " 暂不受理 " ;
return result;
}
public string Buy( int price,EnumIdentityidentity)
{
string result = " 手续费: " + price * 0.2 ;
result
+= Ticket.Buy(price,EnumIdentity.黄牛);
return result;
}
}

下面是买票场景重现:

// 外出务工人员过节回家
public class ProxyClient
{
public static void Call()
{
// 票价
int price = 100 ;
string result = string .Empty;
ITicketTicket1
= new RailwayStation();
result
= Ticket1.Buy(price,EnumIdentity.外出务工人员);
Console.WriteLine(
" 去火车站买票: " + result);

ITicketTicket2
= new Scalper();
result
= Ticket2.Buy(price,EnumIdentity.外出务工人员);
Console.WriteLine(
" 和黄牛买票: " + result);

}
}

再说一个我的亲身经历,很久以前,笔记本的键盘出现串键现象,于是想外接一个键盘来用。一天,正好看到京东上一款非常便宜而且评价很不错的键盘在做促销。似乎没有太多考虑就下了订单,键盘送到家以后,想起了漩涡鸣人常说的一个词 “纳尼?”,是PS/2口的!

// PS/2接口
public interface IPS2
{
void PS2Connect();
}
// PS/2接口的键盘
public class keyboard:IPS2
{
public void PS2Connect()
{
Console.WriteLine(
" PS/2接口类型的键盘已经连接到电脑 " );
}
}

我的笔记本只能用USB口的。

// USB接口
public interface IUSB
{
void USBConnect();
}

怎么办?幸好有这种东西:PS/2 to USB converter 。

// 引入适配器PS/2toUSB转化器
public class Adapter:keyboard,IUSB
{
public void USBConnect()
{
this .PS2Connect();
}
}

现在可以享用新键盘了!

// 一台不支持PS/2接口,但支持USB接口的主机
public class AdapterClient
{
public static void Call()
{
// 主机与转化器连接
IUSBusb = new Adapter();
usb.USBConnect();
}
}



推荐阅读
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 本文详细介绍了如何在Spring框架中设置事件发布器、定义事件监听器及响应事件的具体步骤。通过实现ApplicationEventPublisherAware接口来创建事件发布器,利用ApplicationEvent类定义自定义事件,并通过ApplicationListener接口来处理这些事件。 ... [详细]
  • 本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • Beetl是一款先进的Java模板引擎,以其丰富的功能、直观的语法、卓越的性能和易于维护的特点著称。它不仅适用于高响应需求的大型网站,也适合功能复杂的CMS管理系统,提供了一种全新的模板开发体验。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 对于初学者而言,搭建一个高效稳定的 Python 开发环境是入门的关键一步。本文将详细介绍如何利用 Anaconda 和 Jupyter Notebook 来构建一个既易于管理又功能强大的开发环境。 ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • Irish budget airline Ryanair announced plans to significantly increase its route network from Frankfurt Airport, marking a direct challenge to Lufthansa, Germany's leading carrier. ... [详细]
author-avatar
赵月916_640
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有