Design patterns 在哪些情况下,装饰器模式可以很好地解决问题?

Design patterns 在哪些情况下,装饰器模式可以很好地解决问题?,design-patterns,Design Patterns,我认为一个经典的例子是Window类在GoF书中可以有一个边框装饰器和一个滚动条装饰器 您认为,您知道,在哪些情况下,Decorator模式可以很好地解决问题?软件包 任何可抽象为可扩展根的内容,您必须在此基础上定义不同的重叠和可互换行为: 窗口和边框、滚动条和菜单栏 乐器(音波)和特效(法兰格、华华等) 人大与武器装备 等等…我使用了Decorator模式来管理复杂的角色 我脑海中浮现的例子: public abstract class DecoratedUser : User { p

我认为一个经典的例子是Window类在GoF书中可以有一个边框装饰器和一个滚动条装饰器


您认为,您知道,在哪些情况下,Decorator模式可以很好地解决问题?

软件包

任何可抽象为可扩展根的内容,您必须在此基础上定义不同的重叠和可互换行为:

  • 窗口和边框、滚动条和菜单栏
  • 乐器(音波)和特效(法兰格、华华等)
  • 人大与武器装备

等等…

我使用了Decorator模式来管理复杂的角色

我脑海中浮现的例子:

public abstract class DecoratedUser : User
{
  protected User _decoratedUser;
  public DecoratedUser(User decoratedUser)
  {
    _decoratedUser = decoratedUser;
  }

  public abstract List<Permissions> GetPermissions;
}

public EditorUser : DecoratedUser
{
  public EditorUser(User decoratedUser)
    : base(decoratedUser)
  {}

  public override List<Permissions> GetPermissions
  {
    // return previous permissions + editor permissions
  }
}

public ModeratorUser : DecoratedUser
{
  public ModeratorUser(User decoratedUser)
    : base(decoratedUser)
  {}

  public override List<Permissions> GetPermissions
  {
    // return previous permissions + moderator permissions
  }
}
公共抽象类DecoratedUser:用户
{
受保护的用户;
公共装饰用户(用户装饰用户)
{
_装饰者=装饰者;
}
公共摘要列表权限;
}
公共编辑器用户:DecoratedUser
{
公共编辑器用户(用户装饰用户)
:base(装饰用户)
{}
公共覆盖列表权限
{
//返回以前的权限+编辑器权限
}
}
公共版主用户:DecoratedUser
{
公共版主用户(用户装饰用户)
:base(装饰用户)
{}
公共覆盖列表权限
{
//返回以前的权限+版主权限
}
}

这是一个功能强大的api,但当您第一次使用它时,它会让人不知所措,看起来像是一个OO溢出。@Andre-同意。有趣的是,.NET System.IO API使用了相同的模式,但在.NET 2.0中,它们添加了许多有用的方法,如File.ReadAllLines。布拉德·艾布拉姆斯(Brad Abrams)有一个API差异的非常有趣的例子。在某些场景中,装饰器模式会导致混乱。