装饰者模式
文章目录
- 装饰者模式
- 一、概述
- 二、应用场景
- 三、代码示例
- 四、小结
一、概述
装饰者模式,此模式最核心之处在于装饰二字,之所以需要装饰,是因为基础的功能无法满足需求,并且装饰是临时的,并不是永久的,可以随场景变化替换成其他的。
二、应用场景
为了方便理解,下面我举几个生活中的例子:
-
穿衣服:觉得冷时, 你可以穿一件毛衣。 如果穿毛衣还觉得冷, 你可以再套上一件夹克。 如果遇到下雨, 你还可以再穿一件雨衣。 所有这些衣物都 “扩展” 了你的基本行为, 但它们并不是你的一部分, 如果你不再需要某件衣物, 可以方便地随时脱掉。
-
数据加解密:对于原始的数据,我们可以对其进行压缩、加密、变换等一系列操作,这些操作其实是对原始数据的装饰。
-
发送通知:对于已有的基础通知,我们想要根据情况的不同在其之上再拓展其他类型的通知,比如,拓展短信通知、公众号通知、微信小程序通知等等。
如果你希望在无需修改代码的情况下即可使用对象, 且希望在运行时为对象新增额外的行为, 可以使用装饰模式。
三、代码示例
👉**代码在线运行链接**👈
下面的 golang 示例代码,将以通知场景为例子:
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
装饰。
现在,结合之前的理解,我们可以给装饰者模式如下定义:
装饰者模式——动态地将责任附加到对象上。想要拓展功能,装饰者提供有别于继承的另一种选择