DAY 26:Proxy Pattern,让代理人操作实际的物件

什麽是 Proxy Pattern?

让代理物件操作实际物件,让代理物件处理与业务逻辑无关的事情

UML 图如下:

在操作物件时,有时候我们有加上 log、权限管控等等功能,这跟实际操作物件的业务无关,这时就可以用 Proxy Pattern 来去处理代理这些功能,并且保持介面相同。

Proxy Pattern 与 Decorator Pattern 相似,两者主要差异是:

  • Proxy Pattern: 是增加新的功能在原物件上
  • Decorator Pattern: 是增强原物件的功能

问题情境

PS5 在玩开启游戏时,需要新增 log,但如果在原本业务逻辑上加上 log 会模糊掉业务的意图,我们需要有方法解决此问题。

解决方式

UML 图如下:

新增一个PS5interface,PS5Machine{}PS5MachineProxy{}都依照此 interface 实作,这样使用者在使用时只要依赖PS5interface,就都可以使用PS5Machine{}PS5MachineProxy{}

PS5MachineProxy{}.PlayGame()里呼叫PS5Machine{}.PlayGame(),并在整个实作添加 log。

相关的 code 在Github - go-design-patterns

code 如下:

package main

import (
	"fmt"
	"time"
)

type PS5 interface {
	PlayGame()
}

type PS5Machine struct{}

func NewPS5Machine() *PS5Machine {
	return &PS5Machine{}
}

func (u *PS5Machine) PlayGame() {
	fmt.Println("play game")
}

type PS5MachineProxy struct {
	ps5 *PS5Machine
}

func NewPS5MachineProxy(ps5 *PS5Machine) *PS5MachineProxy {
	return &PS5MachineProxy{
		ps5: ps5,
	}
}

func (p *PS5MachineProxy) PlayGame() {
	start := time.Now()
	p.ps5.PlayGame()
	fmt.Printf("play game cost time: %s", time.Since(start))
}

func main() {
	ps5 := NewPS5MachineProxy(NewPS5Machine())
	ps5.PlayGame()
}

<<:  JS 24 - 请求支援前,要先发送请求!

>>:  【Day 30】最後的总结

[Day 08] 从 tensorflow.keras 开始的 VGG Net 生活 (第一季)

-1. 序 OK,资料分析做完了, 现在要进入演算法的部分, 我们未来几天将从经典卷积神经网路架构中...

企划实现(30)

止损 止损顾名思义就是停止损失,今天在做企划的同时,世界并不会停下来等你发展,所以如果在做企划的同时...

Day 25 阿里云上运行Kubernetes 1 - ACK

在开始前先补充分享Kubernetes服务小知识 Pod: Pod是Kubernetes的基本运行...

使用Visual studio code (vscode) 一键执行编译C++ compiler 超简单

**1.安装Visual Studio code ** 有安装的可跳过这一步 官网连结: http:...

Day 9 - 解密 Order API 回传的 Message 字串

图 9-1: 测试建立订单 接续 Day 8 使用 Order API 建立测试订单後,返回结果是...