从前端视角看设计模式之结构型模式篇

从前端视角看设计模式之创建型模式篇 "设计模式"源于GOF(四人帮)合著出版的《设计模式:可复用的面向对象软件元素》,该书第一次完整科普了软件开发中设计模式的概念,他们提出的设计模式主要是基于以下的面向对象设计原则: - 对接口编程而不是对实现编程 - 优先使用对象组合而不是继承 阅读详情

上篇我们介绍了 设计模式之创建型模式篇,接下来介绍设计模式之结构型模式篇

适配器模式

适配器模式旨在解决接口不兼容的问题,它通过创建一个适配器类,将源对象的接口转换成目标接口,从而使得不兼容的接口能够协同工作。简单来说,适配器模式的目标就是将一个接口转化成客户端所期望的接口,通过这种方式,现有的类(或者第三方类)可以在不修改的情况下被重用


它的使用场景主要有以下几个:

1)需要使用现有类,但其接口不符合系统需求

2)希望创建一个可复用的类,与多个不相关的类一起工作,这些类可能没有统一的接口

3)通过接口转换,将一个类集成到另一个类系中


适配器模式包含以下几个主要角色:

1)目标接口

定义客户需要的接口

2)适配者类

定义一个已经存在的接口,这个接口需要适配

3)适配器类

实现目标接口,并通过组合或继承的方式调用适配者类中的方法,从而实现目标接口


通过以下这个例子来理解适配器模式,假设有一个支付系统,系统中既有旧的支付接口OldPaymentSystem,也有新的支付接口NewPaymentSystem,我们希望使用一个统一的接口来调用这两个不同的支付系统

1)定义目标接口

目标接口是客户端期望使用的接口,所有支付系统都应当提供一个pay()方法

// 目标接口(Target)
class PaymentGateway {
    pay(amount) {
        throw new Error("该方法需要被重写")
    }
}

2)定义源接口

源接口是现有的不兼容接口,假设现有的支付系统使用的是OldPaymentSystem,它提供了一个makePayment()方法,而不是pay()

// 源接口:旧支付系统(Adaptee)
class OldPaymentSystem {
    makePayment(amount) {
      console.log(`使用旧支付系统支付:${amount} 元`)
    }
}

3)创建适配器

适配器的作用是将OldPaymentSystem的接口适配到PaymentGateway接口,使得它们能够通过相同的接口来使用

// 适配器:将旧支付系统适配为目标接口
class OldPaymentAdapter extends PaymentGateway {
    constructor(oldPaymentSystem) {
      super()
      this.oldPaymentSystem = oldPaymentSystem
    }
    // 实现目标接口的 pay 方法
    pay(amount) {
      this.oldPaymentSystem.makePayment(amount)  // 调用旧支付系统的方法
    }
}

4)创建新支付系统

新支付系统与目标接口兼容,直接实现pay()方法

// 新支付系统(NewPaymentSystem)
class NewPaymentSystem extends PaymentGateway {
    pay(amount) {
      console.log(`使用新支付系统支付:${amount} 元`)
    }
}

5)使用适配器模式

客户端只依赖于PaymentGateway接口来进行支付,而不关心支付系统的实现,无论使用的是旧的支付系统还是新的支付系统,客户端代码都会通过统一的接口pay()来进行支付

// 客户端代码:使用支付网关接口
function processPayment(paymentSystem, amount) {
    paymentSystem.pay(amount)  // 使用支付系统进行支付
}
  
// 客户端代码使用旧支付系统
const oldPaymentSystem = new OldPaymentSystem()
const adaptedOldPaymentSystem = new OldPaymentAdapter(oldPaymentSystem) // 使用适配器
processPayment(adaptedOldPaymentSystem, 100)
// 客户端代码使用新支付系统
const newPaymentSystem = new NewPaymentSystem()
processPayment(newPaymentSystem, 200)

执行代码,运行结果如下:

在这里插入图片描述

桥接模式

桥接模式通过将一个对象的抽象部分与它的实现部分分离,使它们可以独立变化,通过组合的方式,而不是继承的方式,将抽象和实现的部分连接起来


它的使用场景主要有以下:

1)当需要抽象和实现分离,且两者独立变化时

2)当系统不希望固定抽象类和实现类的绑定时

3)当多个类的不同实现有类似的功能时


桥接模式包含以下几个主要角色:

1)抽象类

定义抽象接口,通常包含对实现接口的引用

2)扩展抽象类

对抽象的扩展,可以是抽象的子类或具体实现类

3)实现类

定义具体实现类必须遵循的接口,通常包含一些基本操作

4)具体实现

实现实现接口的具体类


通过以下绘制图形的例子来展示桥接模式,图形有不同的形状(如圆形和矩形),而每个图形可以有不同的绘制方式

1)定义实现接口

定义一个接口DrawingAPI,它包含绘制图形的基本方法

// 实现类接口:绘制API
class DrawingAPI {
    drawCircle(radius, x, y) {
      throw new Error("该方法需要被重写")
    }
    drawRectangle(width, height, x, y) {
      throw new Error("该方法需要被重写")
    }
}

2)创建具体实现类

为DrawingAPI接口创建几个具体实现类,例如,一个实现类使用Canvas来绘制图形,另一个实现类使用SVG来绘制

// 具体实现类:使用 Canvas 绘制图形
class CanvasDrawingAPI extends DrawingAPI {
    drawCircle(radius, x, y) {
      console.log(`在 Canvas 上绘制圆形,半径:${radius}, 位置:(${x}, ${y})`)
    }
    drawRectangle(width, height, x, y) {
      console.log(`在 Canvas 上绘制矩形,宽度:${width}, 高度:${height}, 位置:(${x}, ${y})`)
    }
}
  
// 具体实现类:使用 SVG 绘制图形
class SVGDrawingAPI extends DrawingAPI {
    drawCircle(radius, x, y) {
      console.log(`在 SVG 上绘制圆形,半径:${radius}, 位置:(${x}, ${y})`)
    }
    drawRectangle(width, height, x, y) {
      console.log(`在 SVG 上绘制矩形,宽度:${width}, 高度:${height}, 位置:(${x}, ${y})`)
    }
}

3)定义抽象类

从前端视角看设计模式之行为型模式篇 行为型模式关注对象之间的通信和交互,旨在解决对象之间的责任分配和算法的封装 包括:责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、空对象模式、策略模式、模板模式、访问者模式 阅读详情

相关推荐

Spring⽤到了哪些设计模式

Spring 中大量使用设计模式以实现高内聚低耦合,最常见的包括:单例模式:Bean 默认是单例工厂模式:BeanFactory / ApplicationContext 解耦创建过程代理模式:AOP / 事务增强模板方法:JdbcTemplate 等封装主流程观察者模式:事件机制解耦通知策略模式:接口多实现动态挑选这些模式不是硬加进去的,而是融入架构设计的哲学中,体现了“开闭原则”、“依赖倒置”、“接口隔离”等设计原则。

完全体 757

RAD Studio 12安装全攻略:从下载到破解InterBase的完整流程(附KeyPatch使用技巧)

本文提供RAD Studio 12的完整安装指南,包括系统要求、安装步骤及InterBase数据库的高效配置方法。详细介绍了如何使用KeyPatch工具进行许可证处理,并分享了IDE优化和开发技巧,帮助开发者快速上手这一强大的跨平台开发工具。

q6r7s8t9的博客 951

银河麒麟V10ServerSP3中安装Nacos2.4.x详细教程

银河麒麟V10ServerSP3中安装Nacos2.4.x详细教程

yuanjinshenglife的专栏 1303

Abaqus 2023 保姆级安装避坑指南:从环境变量到许可证配置,一次搞定

本文提供Abaqus 2023的详细安装指南,涵盖环境变量设置、许可证配置等关键步骤,帮助用户避开常见安装陷阱。通过系统环境检查、目录结构规划、许可证服务器安装及Java环境配置等实用技巧,确保顺利完成安装并优化软件性能。

weixin_42524276的博客 426

【乐企-工具篇】生成发票左上角二维码

【代码】【乐企-业务篇】生成发票左上角二维码。

九七的博客 708

【PCIe 总线及设备入门学习专栏 6.1 -- PCIe MCTP】

MCTP 是由 DMTF(Distributed Management Task Force)定义的协议,用于提供设备和主机间基于不同传输层(如 PCIe、I²C、USB 等)的管理消息通信能力。在 PCIe 环境下,MCTP 消息作为的一种特殊形式传输,并被赋予唯一的 VDM Code 值0000b,以区别于其他 VDM。MCTP 在 PCIe 环境中作为一种基于 Type 1 VDM 的管理通信协议,提供了设备与主机之间的灵活数据传输能力。

CodingCos的博客 2129

Python爬虫-爬取猫眼演出数据

本文是该专栏的第53篇,后面会持续分享python爬虫干货知识。猫眼平台除了有影院信息之外,它还涵盖了演出信息,比如说“演唱会,音乐节,话剧音乐剧,脱口秀,音乐会,戏曲艺术,相声”等等各种演出相关信息。而本文,笔者将以猫眼平台为例,基于Python爬虫实现获取各种演出信息的数据。废话不多说,具体细节部分以及详细思路逻辑,笔者将在正文结合完整代码进行详细说明。(附带完整代码)

Python进阶专栏《爬虫实战进阶》,《Pyppeteer从入门到精通》原创作者 572

黑猫带你学eMMC协议第4篇:eMMC概述

1 前言 声明: 本文依据eMMC JEDEC5.1协议及个人工作经验整理而成,如有错误请留言。 文章为个人辛苦整理,付费内容,禁止私自转载。 本文大约3000字,从emmc的内部结构框架、供电、总线、寄存器等各方面进行框架性的介绍,本章节内容不需要深入研究,读完本篇文章,只要能对emmc有个框架下的了解,就可以了。 2 内部结构框架 由图可以看出,emmc内部由两块组成:控制器 + 存储介质。emmc内部存储介质绝大部分为nand flash。 众所周知,我们需要存储数据到nand flash中,并

黑猫奥利奥的博客 3341

Rockchip开发系列 - 3.4.GPIO扩展芯片AW95xx和PCA953X(2)

Rockchip开发系列 - 3.3.GPIO扩展芯片AW95xx和PCA953X(2)

fulinux的博客 1007

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: 从前端视角看设计模式之创建型模式篇
下一篇: 从前端视角看设计模式之行为型模式篇
ZoeLandia
博客等级 码龄6年 734粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值