概述定义
定义:
动态地给一个对象添加一些额外的职责,而不改变其原有类的结构。通过功能组合实现整体功能的动态增强,减少核心逻辑的重复代码。它是一种结构型模式,不需要在修改核心代码逻辑,只需要增加修饰类,常用于动态增强功能的场景。
目的:
装饰器模式在不改变核心代码的前提下,动态地扩展其功能,避免因功能组合过多而导致的类爆炸问题。它通过“包装”机制实现对对象行为的增强。
关键点:
应用场景
优缺点
优点
缺点
实现示例
示例背景:读书系统
抽象组件(ReadBooks)
public abstract class ReadBooks
{
public string BookName { get; protected set; } = "";
public abstract int GetReadBookPage();
public override string ToString()
{
return $"{BookName} 读了 ({GetReadBookPage()}) 页";
}
public virtual string DescribeAction()
{
return $"{BookName} 读了 {GetReadBookPage()} 页";
}
}具体组件(BookA、BookB)
public class BookA : ReadBooks
{
public BookA()
{
BookName = "水浒传";
}
public override int GetReadBookPage() => 30;
public override string DescribeAction() => "读了水浒传30页";
}
public class BookB : ReadBooks
{
public BookB()
{
BookName = "西游记";
}
public override int GetReadBookPage() => 50;
public override string DescribeAction() => "读了西游记50页";
}装饰器基类(ReadBookDecorator)
public abstract class ReadBookDecorator : ReadBooks
{
protected ReadBooks _read;
protected ReadBookDecorator(ReadBooks read)
{
_read = read;
}
public override string BookName => _read.BookName;
public override int GetReadBookPage() => _read.GetReadBookPage();
}具体装饰器(WriteNote、DecBook)
public class WriteNote : ReadBookDecorator
{
public WriteNote(ReadBooks readBooks) : base(readBooks) { }
public override string DescribeAction()
{
return _read.DescribeAction() + ",并做了笔记";
}
}
public class ReTell : ReadBookDecorator
{
public ReTell(ReadBooks readBooks) : base(readBooks) { }
public override string DescribeAction()
{
return _read.DescribeAction() + ",并复述了内容";
}
}使用示例
class Program
{
static void Main(string[] args)
{
ReadBooks book1 = new BookA();
book1 = new WriteNote(book1);
book1 = new ReTell(book1);
Console.WriteLine(book1.DescribeAction());
Console.WriteLine(book1.ToString());
}
}总结思考
总结:
我觉的装饰模式是为自己已有功能更好的进行扩展功能的一种方式。既 不影响原有功能,又向核心功能添加了新的包装,有效的把核心职责和装饰功能进行了分离,去除了相关类中重复的逻辑代码,适合功能可叠加的场景。