设计模式大白话——装饰者模式

装饰者模式

文章目录

  • 装饰者模式
      • 一、概述
      • 二、应用场景
      • 三、代码示例
      • 四、小结

一、概述

设计模式大白话——装饰者模式_第1张图片

​ 装饰者模式,此模式最核心之处在于装饰二字,之所以需要装饰,是因为基础的功能无法满足需求,并且装饰是临时的,并不是永久的,可以随场景变化替换成其他的。

二、应用场景

​ 为了方便理解,下面我举几个生活中的例子:

  • 穿衣服:觉得冷时, 你可以穿一件毛衣。 如果穿毛衣还觉得冷, 你可以再套上一件夹克。 如果遇到下雨, 你还可以再穿一件雨衣。 所有这些衣物都 “扩展” 了你的基本行为, 但它们并不是你的一部分, 如果你不再需要某件衣物, 可以方便地随时脱掉。

  • 数据加解密:对于原始的数据,我们可以对其进行压缩、加密、变换等一系列操作,这些操作其实是对原始数据的装饰。

  • 发送通知:对于已有的基础通知,我们想要根据情况的不同在其之上再拓展其他类型的通知,比如,拓展短信通知、公众号通知、微信小程序通知等等。

    如果你希望在无需修改代码的情况下即可使用对象, 且希望在运行时为对象新增额外的行为, 可以使用装饰模式。

三、代码示例

**代码在线运行链接**

下面的 golang 示例代码,将以通知场景为例子:

设计模式大白话——装饰者模式_第2张图片

package main

// Notifier 通知器接口
type Notifier interface {
	Notify()
}

type BasicNotifier struct {
}

func (b *BasicNotifier) Notify() {
	println("send basic message")
}

type SMSDecorator struct {
	// 被装饰的对象
	Notifier
}

func (s *SMSDecorator) Notify() {
	// 注意:此处发送短信的顺序是在调用被装饰对象的 Notify 方法之后,实际上这里可以根据需求自由调整
	s.Notifier.Notify()
	println("send SMS")
}

type EmailDecorator struct {
	// 被装饰的对象
	Notifier
}

func (e *EmailDecorator) Notify() {
	e.Notifier.Notify()
	println("send email")
}

type WeChatDecorator struct {
	// 被装饰的对象
	Notifier
}

func (w *WeChatDecorator) Notify() {
	w.Notifier.Notify()
	println("send WeChat")
}

func main() {
	weChatDecorator := &WeChatDecorator{
		Notifier: &EmailDecorator{
			Notifier: &SMSDecorator{
				Notifier: &BasicNotifier{},
			},
		},
	}
	// send basic message
	// send SMS
	// send email
	// send WeChat
	weChatDecorator.Notify()
}

四、小结

​ 在 Java 中,java.io 包下使用到了装饰者模式,如:FileInputStream 可以被 BufferedInputStream 装饰,然后再被 LineNumberInputStream 装饰。

​ 现在,结合之前的理解,我们可以给装饰者模式如下定义:

装饰者模式——动态地将责任附加到对象上。想要拓展功能,装饰者提供有别于继承的另一种选择

你可能感兴趣的:(设计模式,golang,go,java,装饰器模式,后端,前端)