热门标签 | 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();
}
}



推荐阅读
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • ------------------------------————————————————————————————1.定义一个类,实现与被增强对象相同的接口2.在类中定义一个对象,记住被增强 ... [详细]
  • 在进行QT交叉编译时,可能会遇到与目标架构不匹配的宏定义问题。例如,当为ARM或MIPS架构编译时,需要确保使用正确的宏(如QT_ARCH_ARM或QT_ARCH_MIPS),而不是默认的QT_ARCH_I386。本文将详细介绍如何正确配置编译环境以避免此类错误。 ... [详细]
  • 本文介绍了如何在多线程环境中实现异步任务的事务控制,确保任务执行的一致性和可靠性。通过使用计数器和异常标记字段,系统能够准确判断所有异步线程的执行结果,并根据结果决定是否回滚或提交事务。 ... [详细]
  • 题目描述:给定一个N*M的网格,初始时网格中有k个芯片,每个芯片的位置已知。玩家可以在每一步操作中将所有芯片沿同一方向移动一格。如果芯片到达边界,则保持不动。目标是通过一系列操作,使每个芯片依次访问指定的目标位置。 ... [详细]
  • 本文介绍如何在Spring Boot项目中集成Redis,并通过具体案例展示其配置和使用方法。包括添加依赖、配置连接信息、自定义序列化方式以及实现仓储接口。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • Java 实现二维极点算法
    本文介绍了一种使用 Java 编程语言实现的二维极点算法。该算法用于从一组二维坐标中筛选出极点,适用于需要处理几何图形和空间数据的应用场景。文章不仅详细解释了算法的工作原理,还提供了完整的代码示例。 ... [详细]
  • 利用Selenium与ChromeDriver实现豆瓣网页全屏截图
    本文介绍了一种使用Selenium和ChromeDriver结合Python代码,轻松实现对豆瓣网站进行完整页面截图的方法。该方法不仅简单易行,而且解决了新版Selenium不再支持PhantomJS的问题。 ... [详细]
  • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
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社区 版权所有