外观和幕后的构建器模式
Facade and Builder Pattern behind the scenes
我已经完成了结合外观和构建器模式的练习。 Root 是一个简单的 LoginService-Interface
public interface LoginService {
void addUser(int id, String username, String password, String mail);
boolean login(String username, String password);
void logout();
}
其他 类 是 LoginServiceDecorator 和一些具体的装饰器。终于有一个Builder了,这样测试的:
service = new LoginServiceBuilder().withValidation().withEncoding().withLogging().toService();
有一些测试用例。
一切都很好,直到 toService()
方法的实施,我对如何实施没有真正的好主意。我显示我卡住了:
LoginServiceBuilder
public class LoginServiceBuilder {
/*
* Note that the decorators must be connected in reverse order of the
* builder method invocations. So we use a stack to hold all decorator
* instances and at the end of the building process, we connect the
* decorators in the right order.
*/
private Stack<LoginServiceDecorator> stack = new Stack<LoginServiceDecorator>();
public LoginServiceBuilder() {
}
public LoginServiceBuilder withValidation() {
stack.push(new ValidationDecorator(new LoginServiceImpl()));
return this;
}
public LoginServiceBuilder withEncoding() {
stack.push(new EncodingDecorator(new LoginServiceImpl()));
return this;
}
public LoginServiceBuilder withLogging() {
stack.push(new LoggingDecorator(new LoginServiceImpl()));
return this;
}
public LoginService toService() {
// Here I stucked
}
嗯,最后放弃了,看了一下解决办法:
public LoginService toService() {
LoginService service = new LoginServiceImpl();
while (!stack.isEmpty()) {
LoginServiceDecorator decorator = stack.pop();
decorator.setService(service); // just to set the private member there (Type of the Interface as shown at beginning)
service = decorator;
}
return service;
}
为什么我还在抓耳挠腮:对我来说,当 Stack 为空时,服务很简单,它捕获的最后一个。也许有人可以用软话解释我,为什么我现在应该拥有所有装饰器。
在此先致谢
装饰器的作用是在一个对象上动态地添加一个行为。
这就是他们实现相同接口的原因。
您应该为一项添加的行为设置一个装饰器。
这就是你创建一堆装饰器的原因
A decorator.anOperation()
应该执行 decoratedObject.anOperation()
通过使用继承,您可以替换 decorated 而不是 decoratedObject。
这就是你拥有 service = decorator
的原因。
在您的示例中,您将服务(decoratedObject)替换为关联的装饰器,然后在 decoratedObject 上应用下一个装饰器。
在堆栈的末尾你有一个 "fullDecoratedObject".
如需更多解释,我觉得这个网站很有用http://www.dofactory.com. The implementation is in C# but it's easily convertible in Java. watch this page : http://www.dofactory.com/net/decorator-design-pattern
希望对您有所帮助
我已经完成了结合外观和构建器模式的练习。 Root 是一个简单的 LoginService-Interface
public interface LoginService {
void addUser(int id, String username, String password, String mail);
boolean login(String username, String password);
void logout();
}
其他 类 是 LoginServiceDecorator 和一些具体的装饰器。终于有一个Builder了,这样测试的:
service = new LoginServiceBuilder().withValidation().withEncoding().withLogging().toService();
有一些测试用例。
一切都很好,直到 toService()
方法的实施,我对如何实施没有真正的好主意。我显示我卡住了:
LoginServiceBuilder
public class LoginServiceBuilder {
/*
* Note that the decorators must be connected in reverse order of the
* builder method invocations. So we use a stack to hold all decorator
* instances and at the end of the building process, we connect the
* decorators in the right order.
*/
private Stack<LoginServiceDecorator> stack = new Stack<LoginServiceDecorator>();
public LoginServiceBuilder() {
}
public LoginServiceBuilder withValidation() {
stack.push(new ValidationDecorator(new LoginServiceImpl()));
return this;
}
public LoginServiceBuilder withEncoding() {
stack.push(new EncodingDecorator(new LoginServiceImpl()));
return this;
}
public LoginServiceBuilder withLogging() {
stack.push(new LoggingDecorator(new LoginServiceImpl()));
return this;
}
public LoginService toService() {
// Here I stucked
}
嗯,最后放弃了,看了一下解决办法:
public LoginService toService() {
LoginService service = new LoginServiceImpl();
while (!stack.isEmpty()) {
LoginServiceDecorator decorator = stack.pop();
decorator.setService(service); // just to set the private member there (Type of the Interface as shown at beginning)
service = decorator;
}
return service;
}
为什么我还在抓耳挠腮:对我来说,当 Stack 为空时,服务很简单,它捕获的最后一个。也许有人可以用软话解释我,为什么我现在应该拥有所有装饰器。
在此先致谢
装饰器的作用是在一个对象上动态地添加一个行为。 这就是他们实现相同接口的原因。
您应该为一项添加的行为设置一个装饰器。 这就是你创建一堆装饰器的原因
A decorator.anOperation()
应该执行 decoratedObject.anOperation()
通过使用继承,您可以替换 decorated 而不是 decoratedObject。
这就是你拥有 service = decorator
的原因。
在您的示例中,您将服务(decoratedObject)替换为关联的装饰器,然后在 decoratedObject 上应用下一个装饰器。
在堆栈的末尾你有一个 "fullDecoratedObject".
如需更多解释,我觉得这个网站很有用http://www.dofactory.com. The implementation is in C# but it's easily convertible in Java. watch this page : http://www.dofactory.com/net/decorator-design-pattern
希望对您有所帮助