装饰器模式

装饰器模式的概念

装饰器模式是一种结构型设计模式,它允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。装饰器模式提供了一种比继承更加灵活的解决方案。

装饰器模式的作用

动态扩展功能:可以在运行时动态地为对象添加新的功能,而不需要修改对象的代码。
避免子类爆炸:通过组合而不是继承来扩展功能,避免了子类数量的爆炸。
保持单一职责原则:每个装饰器类只负责添加单一的功能,符合单一职责原则。

装饰器模式应用场景

日志记录:在方法调用前后添加日志记录。

权限校验:在方法调用前进行权限校验。

缓存:在方法调用前后添加缓存逻辑。

输入输出流处理:在输入输出流中添加加密、解密、压缩等功能。

Go 语言实现装饰器模式示例

下面是一个简单的装饰器模式示例,模拟一个文件读取操作,并在读取前后添加日志记录和权限校验。

package main

import (
	"fmt"
)

// Reader 定义读取接口
type Reader interface {
	Read() string
}

// FileReader 实现文件读取
type FileReader struct {
	FilePath string
}
func (fr *FileReader) Read() string {
	// 模拟文件读取操作
	return "File content from " + fr.FilePath
}

// LoggerDecorator 日志装饰器
type LoggerDecorator struct {
	Reader Reader
}
func (ld *LoggerDecorator) Read() string {
	fmt.Println("Logging before reading...")
	content := ld.Reader.Read()
	fmt.Println("Logging after reading...")
	return content
}

// PermissionDecorator 权限装饰器
type PermissionDecorator struct {
	Reader Reader
}
func (pd *PermissionDecorator) Read() string {
	if !pd.hasPermission() {
		return "Permission denied"
	}
	return pd.Reader.Read()
}
func (pd *PermissionDecorator) hasPermission() bool {
	// 模拟权限检查
	fmt.Println("Checking permissions...")
	return true
}

func main() {
	// 创建文件读取器
	fileReader := &FileReader{FilePath: "example.txt"}
	// 添加日志装饰器
	loggerReader := &LoggerDecorator{Reader: fileReader}
	// 添加权限装饰器
	permissionReader := &PermissionDecorator{Reader: loggerReader}
	// 读取文件内容
	content := permissionReader.Read()
	fmt.Println("Content:", content)
}