我的设计模式之旅、06 代理模式

编程旅途是漫长遥远的,在不同时刻有不同的感悟,本文会一直更新下去。

程序介绍

image-20220911030825169

本程序实现代理模式。小明很喜欢同班的雪怡,但是过于腼腆的他不敢当面说。打算通过手机(代理)跟雪怡表白!

小明给雪怡发了个表情包
小明祝雪怡生日快乐
小明对雪怡说做我女朋友吧
雪怡对小明说我愿意!

程序代码

proxy.go

package main

import "fmt"

type ISender interface {
	sendMeme(r People)
	sendWish(r People)
	sendConfession(r People)
	sendYes(r People)
}

type People string

func (p People) sendMeme(r People) {
	fmt.Printf("%s给%s发了个表情包\n", p, r)
}

func (p People) sendWish(r People) {
	fmt.Printf("%s祝%s生日快乐\n", p, r)
}

func (p People) sendConfession(r People) {
	fmt.Printf("%s对%s说做我女朋友吧\n", p, r)
}

func (p People) sendYes(r People) {
	fmt.Printf("%s对%s说我愿意!\n", p, r)
}

type Proxy struct {
	People
}

func (p Proxy) sendMeme(r People) {
	p.People.sendMeme(r)
}

func (p Proxy) sendWish(r People) {
	p.People.sendWish(r)
}

func (p Proxy) sendConfession(r People) {
	p.People.sendConfession(r)
}

func (p Proxy) sendYes(r People) {
	p.People.sendYes(r)
}

main.go

package main

func main() {
	var girl, boy People = "雪怡", "小明"
	proxy := Proxy{boy}
	proxy.sendMeme(girl)
	proxy.sendWish(girl)
	proxy.sendConfession(girl)
	proxy.People = girl
	proxy.sendYes(boy)
}

Console

小明给雪怡发了个表情包
小明祝雪怡生日快乐
小明对雪怡说做我女朋友吧
雪怡对小明说我愿意!

思考总结

什么是代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

image-20220910011907441

代理模式:为其他对象提供一种代理以控制对这个对象的访问。

主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。

何时使用:想在访问一个类时做一些控制。

如何解决:增加中间层。

关键代码:实现与被代理类组合。

应用实例: 1、Windows 里面的快捷方式。 2、猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。 3、买火车票不一定在火车站买,也可以去代售点。 4、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。

优点: 1、职责清晰。 2、高扩展性。 3、智能化。

缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

使用场景:按职责来划分,通常有以下使用场景: 1、远程代理。 (对象在不同的地址空间)2、虚拟代理。 (根据需要创建开销很大的对象,然后存放实例化长时间的对象,如网页页面)3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 (控制真实对象访问时的权限)5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。(当调用真实对象时,代理处理另外一些事

代理模式与外观模式主要区别:

  • 代理模式是一个类代表另一个类的功能,代表一个单一对象,而外观对象代表一个子系统。
  • 代理的客户对象无法直接访问目标对象,小明无法直接跟雪怡面对面,他们两只能通过手机间接访问。代理可以提供对目标对象的访问控制。
  • 外观的客户对象可以直接访问子系统的各个对象,但通常由外观对象提供子系统各个元件功能的简化的共同层次的调用接口。

代理模式与适配器模式主要区别:

  • 代理是一种原来对象的代表,是具有现有对象的对象,其他需要与这个对象打交道的操作都是与这个代表交涉。而适配器不需要虚构出一个代表者,只需要为应付特定使用目的,将原来的类进行一些组合。
  • 适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。

代理模式与装饰器模式主要区别:

  • 装饰器模式为了增强功能,而代理模式是为了加以控制。

参考资料

  • 《Go语言核心编程》李文塔
  • 《Go语言高级编程》柴树彬、曹春辉
  • 《大话设计模式》程杰
  • 单例模式 | 菜鸟教程
posted @ 2022-09-10 01:44  小能日记  阅读(24)  评论(0编辑  收藏  举报