此时,我将原来的SecurityUser类更名为SecuritySignInDecorator,便于理解。SignInDecorator是一个抽象类,继承了User类,同时User类对象又作为一个属性存在于SignInDecorator抽象类中。注意,这里的组合方式其实有多种实现方式。如作为一个属性,或者作为构造函数的参数等等。
抽象类SignInDecorator的代码如下所示:
public abstract SignInDecorator:User { private User m_user; public User User { get {return m_user;} set {m_user = value;} } public override void SignIn() { if (m_user != null) { m_user.SignIn(); } } } |
而SignInDecorator的子类定义则如下:
public class SecuritySignInDecorator:SignInDecorator { public override void SignIn() { if (IsValid()) { base.SignIn(); } else { throw new NotAuthorizationException(); } } private bool IsValid() { //略; return true; } } public class LoggingSignInDecorator:SignInDecorator { public override void SignIn() { base.SignIn(); Logging(); } private void Logging() { //略; } } |
目前的结构完全解决了前面利用继承或组合所出现的问题,避免了类的无限增加,权限验证或者日志记录的职责也能很好地重用,同时权限验证和日志记录等装饰类由于同样继承了User,因此根据多态原理,是可以完全替换User类型的对象的。
此外,利用Decorator模式还可以解决动态组合装饰的问题,例如为SignIn()方法既添加权限验证功能,又添加日志记录功能,此时并不需要新增一个类。实现如下:
User user = new User(); SignInDecorator securtiyDec = new SecuritySignInDecorator(); securityDec.User = user; SignInDecorator loggingDec = new LoggingSignInDecorator(); loggingDec.User = securityDec; loggingDec.SignIn(); |
loggingDec.SignIn()方法执行的时序图如下:
上一页 [1] [2] [3] [4] [5] 下一页

【责编:John】