如何改进以下代码的设计:
class Foo {
public Configuration configure() {
return new Configuration().withPropertyA().withPropertyB();
}
}
class Configuration{
private boolean propertyA = false;
private boolean propertyB = false;
public Configuration withPropertyA() {
this.propertyA = true;
return this;
}
public Configuration withPropertyB() {
this.propertyB = true;
return this;
}
public boolean hasPropertyA() {
return this.propertyA;
}
public boolean hasPropertyB() {
return this.propertyB;
}
...
}
class Client{
public void someMethod(Configuration config) {
if (config.hasPropertyA() {
doStuffA();
}
if (config.hasPropertyB() {
doStuffB();
}
//...
}
}
即,Configuration类为调用者(Client
)保留一些标志,告诉调用者需要配置哪些“东西”。如果已设置,则客户端知道如何为每个标志执行操作。我想摆脱Client
中的if语句以及在Configuration
实例中简单设置布尔标志的概念。你能建议一个更“通用”和面向对象的方法吗?
亲切的问候
答案 0 :(得分:1)
您可以使用策略模式。 每个If成为一个策略,它实现了doStuff,具有自己的逻辑。设置属性(A,B ...)后,将策略添加到列表中。你只需要循环策略并执行它们,而不需要任何ifs:
public class Foo {
public Configuration configure() {
return new Configuration().withPropertyA().withPropertyB();
}
}
class Configuration {
Set<StuffStrategy> strategies = new HashSet<StuffStrategy>();
public Configuration withPropertyA() {
strategies.add(new PropertyAStrategy());
return this;
}
public Configuration withPropertyB() {
strategies.add(new PropertyBStrategy());
return this;
}
public void executeStrategies() {
for (StuffStrategy strategy : strategies) {
strategy.doStuff();
}
}
}
interface StuffStrategy {
public void doStuff();
}
class PropertyAStrategy implements StuffStrategy {
@Override
public void doStuff() {
}
}
class PropertyBStrategy implements StuffStrategy {
@Override
public void doStuff() {
}
}
class Client {
public void someMethod(Configuration config) {
config.executeStrategies();
}
}
答案 1 :(得分:1)
我不相信你能找到比现在更多的OO方法,特别是如果你可以有更多的参数,实际上这是一个众所周知的设计模式Builder,你能做到最好通过使对象o.on("company_filter_fetch_page_complete", function(e) {
return t.ajax({
url: "/companies/startups",
data: e,
dataType: "json",
success: function(t) {
return t.html ?
(E().find(".more").empty().replaceWith(t.html),
c()) : void 0
}
})
}),
从外部不可变,只有您的构建器类应该能够创建Configuration
的实例,才能正确地完成实现此模式。您的构建器应该是一个可变的静态内部类,其中Configuration
方法返回一个不可变的build()
实例。
答案 2 :(得分:-1)
看起来你正在写一个陷阱
尝试在这种情况下使用设计中更灵活的东西......就像一个枚举器...... 看看这个:
public class Foo {
public Configuration configure() {
return new Configuration(Config.A);
}
}
class Configuration {
enum Config{
A,B, NONE}
private Config propertyConfig = Config.NONE;
public Configuration(Config a) {
propertyConfig=a;
}
public Config getConfig() {
return this.propertyConfig;
}
...
}
class Client {
public void someMethod(Configuration config) {
switch (config.getConfig()) {
case A:
System.out.println("a config");
break;
case B:
System.out.println("b config");
break;
default:
break;
}
// ...
}
}