设计模式之桥接

桥接模式的介绍

桥接模式就是通过将抽象部分与实现部分分离,把多种可匹配的使用进行组合。其实就是在A类中含有B类接口,通过构造函数传递B类的实现,这个B类就是设计的桥。

它是一种结构型设计模式,可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能在开发时分别使用。

其实简单说就是将一个复杂类/对象进行拆分,拆分为接口(抽象)和实现,利用接口中的某一实例变量来调用实现的某一块逻辑实现(这个过程最最重要的就是通过构造函数来声明和传递)。

桥接模式的结构

1、抽象部分:提供高层控制逻辑,依赖于完成底层实际工作的实现对象。

2、实现部分:为所有具体声明通用接口。抽象部分仅能通过在这里声明的方法与实现对象进行交互。

抽象部分可以列出和实现部分一样的方法,但是抽象部分通常声明一些复杂行为,这些行为依赖于多种由实现部分声明的原语操作。

3、具体实现:实现部分的对象模块,继承于实现部分。

4、精确抽象:提供控制逻辑的变体,与其父类一样,它们通过实现接口与不同的实现进行交互。

一般情况下,客户端只关心如何与抽象部分合作,但是客户端需要将抽象对象与一个实现对象连接在一起。


  • 想拆分或重组一个具有多重功能的庞杂类

  • 希望在几个独立维度上扩展一个类

  • 需要在运行时切换不同实现方法

设计模式并不是一种对类进行组织的方式,它还能用于沟通意图 和解决问题。

桥接模式的优缺点

优点:

  • 可创建与平台无关的类和程序

  • 客户端代码只与高层抽象部分交互,不会接触到平台的详细信息(具体的实现方式)

  • 满足开闭原则。可以新增抽象部分和实现部分,且它们之间不会相互影响

  • 单一职责原则。抽象部分专注于处理高层逻辑,实现部分处理平台细节。

缺点:

  • 别的高内聚的类中使用此模式,不然会越来越复杂。

桥接、状态模式和策略模式的接口都非常相似。实际上,它们都基于组合模式 :即将工作委派给其他对象,不过也各自解决了不同的问题。

层次结构中的第一层(抽象部分)将包含对第二层(实现部分)对象的引用。抽象部分能将一些对自己的调用委派给实现部分的对象。

所有的实现部分都有一个通用接口,因此它们能在抽象部分内部相互替换。

Demo

    /// <summary>/// 支付类  (抽象部分)/// </summary>public class Pay{protected IPayMode _padMode;                    public Pay(IPayMode padMode){this._padMode = padMode;}public virtual string Validation(int uId,string uName) {return "验证情况汇报:"+_padMode.IsControl(uId);}}

具体的实现

    /// <summary>/// 支付宝支付  (具体实现类)/// </summary>class zfbPay:Pay{public zfbPay(IPayMode _padMode): base(_padMode){ }public override string Validation(int uId, string uName){var isValue =_padMode.IsControl(uId);return "支付宝正在进行验证操作 ," + isValue + ",用户:" + uName;}}
    /// <summary>/// 微信支付  (具体实现类)/// </summary>class wxPay:Pay{public wxPay(IPayMode padMode) :base(padMode){}        public override string Validation(int uId, string uName){var isValue = _padMode.IsControl(uId);return "微信正在进行验证操作:" + isValue+",用户:"+uName;}}

接口部分

   /// <summary>/// 支付模式 /// 人脸识别、密码识别/// </summary>public interface IPayMode{/// <summary>/// 是否满足风控要求/// </summary>/// <param name="uId"></param>/// <returns></returns>string IsControl(int uId); }
    /// <summary>/// 人脸识别/// </summary>public class FaceRecognition : IPayMode{public string IsControl(int uId){            return "人脸识别成功,你的ID为 " + uId + "满足风控要求,支付成功。";}}/// <summary>/// 账号密码/// </summary>public class PasswardInput:IPayMode{public string IsControl(int uId){            return "密码识别成功,你的ID为 " + uId + "满足风控要求,支付成功。";}}

测试验证

    class Program{static void Main(string[] args){Pay wxPay = new wxPay(new FaceRecognition());var result=wxPay.Validation(001,"阿辉");Console.WriteLine(result);Pay zfbPay = new zfbPay(new PasswardInput());result=zfbPay.Validation(002,"阿七");Console.WriteLine(result);Console.ReadKey();}}
不关心具体实现,只是单纯的调用。

仔细看上面的代码,在测试验证部分,我们只是需要使用哪一种付款模式就直接传递值进去就可以,不需要关系具体内部的实现逻辑,也满足单一职责原则和开闭原则。

小寄语

人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发  谢谢。

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

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

相关文章

WinAPI: midiOutGetNumDevs - 获取 MIDI 输出设备的数目

//声明: midiOutGetNumDevs: UINT; {无参数; 返回 MIDI 输出设备的数目}//举例:

去除HTML标签--SQL写法

----Author: Derry--Create date: 2009-07-27--Description: 去除HTML标签--ALTERFUNCTION[dbo].[StripAllTags]( inputVARCHAR(8000))RETURNSVARCHAR(8000)ASBEGINdeclareResultvarchar(8000), startint, endint, lenintsetinputinput<>setResult…

手把手教你用Java的swing制作计算器

其实学到Java这一块很多人会觉得很复杂实际上学会使用方法其实很简单 话不多说直接贴源码,如下&#xff1a; package cn.sjy.calculator;import javax.swing.*; import java.awt.*;/*** 简易计算器* author 石俊熠* 2020.7.13 11:24* 注&#xff1a;仿照某Java大佬的源码改之*…

你们都被电视剧版的 《西游记》给骗了!| 今日趣图

全世界只有3.14 % 的人关注了青少年数学之旅你们都被电视剧版的《西游记》给骗了&#xff01;电视剧里挑担子的是沙僧但其实《西游记》原著中大部分都是二师兄挑担子沙僧也就是打个下手&#xff08;图源名场面All&#xff0c;侵权删&#xff09;如果再有人嘲笑你胖你就把这条涨…

lua工具库penlight--08额外的库(二)

执行一系列的参数 类型说明符也可以 是 (MIN .. MAX) 的形式。 local lapp require pl.lapp local args lapp [[ Setting ranges <x> (1..10) A number from 1 to 10 <y> (-5..1e6) Bigger range ]] print(args.x,args.y) 下面的意思是大与或等于 MIN 和小于或等…

.NET 6 Preview 6 Released

宣布 .NET 6 Preview 6Richard 2021 年 7 月 14 日我们很高兴发布 .NET 6 Preview 6。Preview 6 是我们进入 RC 时期之前的倒数第二个预览版。将有两个 RC 版本。此版本本身相对较小&#xff0c;而 Preview 7 会更大一些。在那之后&#xff0c;我们将进行质量修复&#xff0c;直…

SQL2K数据库开发十五之表操作查看表中的数据

1.可以使用SELECT语句查询表中的数据。如在查询分析器中执行SELECT * FROM Products语句就可以查询Products表中的数据&#xff0c;如下图&#xff1a;2.如在企业管理器中查询表中数据&#xff0c;则要展开sample数据库&#xff0c;在Products表上右击鼠标&#xff0c;在弹出的…

转:VC6.0与VC.net的具体区别

原文&#xff1a;http://www.itzhe.cn/article/20080302/98267.html 对于VC6.0和VC.net本人有几点疑问。 1.首先&#xff0c;vc.net开发的程序是否依然需要.net框架的支持&#xff1f;是否可以独立运行&#xff1f; 2.对与VC.net开发出来的程序在运行效率上和VC6.0开发的差距…

中考新大纲:初中数学无非就这26个考点!孩子吃透,再笨也能考115分!

全世界只有3.14 % 的人关注了青少年数学之旅升入初二、初三后数学难度急速上升&#xff0c;您的孩子是否学得吃力成绩却无法提高&#xff1f;1.总说自己上课都能听懂&#xff0c;可题目稍微一变就不会做&#xff1b;2.连课下时间都在刷题&#xff0c;到头来做的全是无用功&…

程序员(工作2年)立flag,面四家,成三家,最后进了蚂蚁.....

作为一个毕业2年的coder, 最近一直在寻找一个合适的机会能够换一个环境&#xff0c;一是寻找一个更加宽阔的舞台不断的提升自己&#xff0c;二是让自己走出现在的舒适区域&#xff0c;迎接更多的挑战和认识更多的人。当然还有为了获得更加好的一份收入。 这一个月&#xff0c;…

深入分析Volatile的实现原理

2019独角兽企业重金招聘Python工程师标准>>> 术语英文单词 描述 共享变量在多个线程之间能够被共享的变量被称为共享变量。共享变量包括所有的实例变量&#xff0c;静态变量和数组元素。他们都被存放在堆内存中&#xff0c;Volatile只作用于共享变量。内存屏障Memor…

Serilog 最佳实践

Serilog 最佳实践概述Serilog[1]是 Microsoft .NET 的结构化日志记录库&#xff0c;并已成为Checkout.com 上NET 的首选日志记录库。它支持各种日志记录目的地&#xff08;称为接收器[2]&#xff09;包从标准控制台和基于文件的接收器到日志服务&#xff0c;如 Datadog。本指南…

Spring的API获取泛型实际类型

文章目录 学习链接Spring中获取泛型类型类上有约束的泛型BaseService\<T> &#xff08;带泛型父类&#xff09;CustomService\<T, K,U> &#xff08;带泛型接口&#xff09;CustomServiceImpl &#xff08;指定泛型具体类型&#xff09;GenericTest 获取类上的泛型…

我想跳槽

我是个小文员。公司很小&#xff01;2007年8月来到这个公司的&#xff01;我不喜欢我现在的工作&#xff0c;因为它不是我想要的&#xff01;我喜欢的是关于“IT”方面的工作&#xff0c;当然“IT”这个概念很大&#xff01;我想从事软件开发或者软件测试这方面的工作&#xff…

世界上迄今为止最安全的加密算法

全世界只有3.14 % 的人关注了青少年数学之旅一个只能用算力来破解的加密算法1人类的加密史公元前5世纪&#xff0c;古希腊人使用一根叫scytale的棍子来传递加密信息。要加密时&#xff0c;先绕棍子卷一张纸条&#xff0c;把信息沿棒水平方向写&#xff0c;写一个字旋转一下&…

手把手教你java快速过滤关键词

java过滤关键词 敏感词、文字过滤是一个网站必不可少的功能&#xff0c;如何设计一个好的、高效的过滤算法是非常有必要的。前段时间我一个朋友&#xff08;马上毕业&#xff0c;接触编程不久&#xff09;要我帮他看一个文字过滤的东西&#xff0c;它说检索效率非常慢。我把它程…

[Delphi]根据输入日期按年月周日输出日期段

输入变量ADateStart&#xff0c;并为其填写起始日期&#xff0c;变量ADateEnd&#xff0c;计算类型AType&#xff0c;输出变量ADateStart&#xff0c;变量ADateEnd procedureFormatDateByType(AType:Integer; varADateStart, ADateEnd: TDate); var//type0日 1周 2月 3年 …

TIOBE 发布 8 月编程语言榜单:C# 排名如何?

刚刚 TIOBE 官方最新发布了 8 月的编程语言榜单&#xff0c;一起来看本月榜单中有什么值得关注的发展趋势吧&#xff1f;每一种编程语言的兴起从来都离不开它所适用的技术领域&#xff0c;二者之间一直以来都是水涨船高的关系。数据挖掘和人工智能的蓬勃发展也是如此&#xff0…

两年了,你还是那个你 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源都市音酱&#xff0c;侵权删&#xff09;

Delphi 的字符及字符串[4] - 字符串、字符指针与字符数组

//字符串 < > 字符数组 vararr: array[0..5] of Char;str: string; begin{可以把字符串常量直接赋给字符数组; 但超界不行}arr : Delphi;ShowMessage(arr); {Delphi}{可以把字符数组直接赋给字符串变量}str : arr;ShowMessage(str); {Delphi}{其实字符串内部也是包含了一…