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