Proxy 代理模式

今天要谈到代理模式,其实跟昨天的装饰器模式很类似。代理模式的目的在於,因应某些条件替换物件原本的行为。

同样用昨天的例子,这里有 BookPrinter 可以把书印出来

abstract class Printer {
  abstract print(): void
}

class BookPrinter extends Printer {
  genre: string;
  constructor(genre: string) {
    super()
    this.genre = genre
  }

  print(): string {
    return `This is a ${this.genre} book!`
  }
}

但我们希望这个 BookPrinter 只有在 "ready" 的时候才印书,如果尚未 "ready" 的话,就让使用者知道 printer 还没有准备好。这时候我们可以怎麽做呢?

首先,我们建立一个 BookPrinterProxy 类别。跟昨天的装饰器很像,我们可以传入物件到这个 proxy 当中,再由这个 proxy 帮我们「加料」做点事情。

这里我们要做的事情就是,判断 printer 是否 ready。这里假设有一个 isReady 的变数,如果为 true,那麽就执行原有物件的功能;若为 false,那麽就让 proxy 代为处理,印出 "Printer is not ready" 的讯息

class BookPrinterProxy extends Printer {
  printer: Printer;
  constructor(printer: Printer){
    super()
    this.printer = printer
  }

  print(): string {
    if (isReady) {
      return `${this.printer.print()}`
    } else {
      return 'Printer is not ready!'
    }
  }
}

实作结果如下:

const scienceBook = new BookPrinter('science')
const bookProxy = new BookPrinterProxy(scienceBook)
let isReady = false


bookProxy.print()  // Printer is not ready!

isReady = true

bookProxy.print()  // This is a science book!

代理模式

代理模式其实在平常的开发当中很常见,譬如协助我们管理权限、快取等等,让我们可以不用更动原本的物件的情况下,面对其他各种状况。

代理模式可以说是特别版的装饰器模式,差别在於装饰器模式着重在层层套嵌的扩展性,而代理模式则着重於面对不同条件下的应对(代理)方式。


<<:  Day27-介绍 React Developer Tools

>>:  Day 27:572. Subtree of Another Tree

Day 3 - 部署 Home Lab 网路 - 上

在 Day 2 时,我们有与大家分享并安装 Proxmox VE 虚拟化管理平台。 那今天,我们要...

[Day0] 参赛初衷

我的背景 目前自己前端的程序能力只学过基础 html+css+js,没有独立开发过大型专案的经验,算...

[01] 所以是哪个 P ? 前言

首先先来看看我们 P 开头的程序语言有哪些吧 恩,比我预想的还多 原本是写 PHP 的,写了四年想摸...

[Day20] Yew WASM 凯萨密码简介以及加密

不知道为啥总感觉进度堪忧,我是说准备工作 之前原本有一个能运行的东西现在运行不了 我翻 commit...

偷懒无罪,让点子自动产生吧

在整理衣着出门的时候,脑袋瓜一直在转着不同的东西,包含等等要面对的电路,还有今天没有起来的检讨,但手...