【问题标题】:Applying design patterns whilst collaborating with Facade pattern在与 Facade 模式协作的同时应用设计模式
【发布时间】:2021-08-15 15:38:05
【问题描述】:

起初,我的输入是“在线”或“离线”

如果输入在线,它从在线资源中获取数据,如果它离线,它只从我个人制作的模拟文本文件中获取数据。然后我使用 swing 在 GUI 上显示结果。

所以一开始我的主要方法是这样的:

public static void main(String[] args) {

    if(args[0].equalsIgnoreCase("online")) {
        JFrame frame = new JFrame("Online");
        JTextField...
        ...
    } else if(args[0].equalsIgnoreCase("offline")) {
        JFrame frame = new JFrame("Offline");
        JTextField...
        ...
    }
}

我使用了一种设计模式来隐藏系统的复杂性。

应用立面

public static void main(String[] args) {

    Facade facade = new Facade();

    if(args[0].equalsIgnoreCase("online")) {
        facade.online();
    } else if(args[0].equalsIgnoreCase("offline")) {
        facade.offline();
    }
}

但问题是,我现在还有一个输入,即“pdf”或“txt”,它将决定数据输出应存储在哪个文件扩展名中。

所以我想在这里实现的是,我想应用一种设计模式来掩盖第二个输入,同时保持外观模式。

我想要的主要方法是这样的:

public static void main(String[] args) {
    SomeRandomDesignPattern pattern = new SomeRandomDesignPattern();
    pattern.execute(args);
}

我正在考虑在这里使用策略模式,但是当我搜索谷歌时,人们不习惯将 if/else 语句与策略模式一起使用,这让我对如何将它应用到系统感到困惑.

谁能告诉我我可以申请什么样的设计模式以及如何申请?

如果应用设计模式不是最好的方法,有没有更好的方法呢? (我个人希望避免使用嵌套的 if/else 语句...)

提前致谢!

【问题讨论】:

  • 你永远不会摆脱在某个地方拥有那个 if 语句,这只是你把它放在哪里的问题。设计模式不仅仅是使条件消失的魔法。如果您认为添加复杂层会使您的代码更好,那您就错了。
  • 也就是说,你可以通过扩展 JFrame 来清理你的代码。然后在 main 中,您只需实例化 JFrame frame = new OnlineFrame()new OfflineFrame()
  • @Michael 你的观点很好地体现了务实的反思。我同意(+1)。不过,为了完整起见:“设计模式不仅仅是使条件消失的魔法。” 这并不完全正确。大多数模式通过降低圈复杂度来解决复杂度问题。在这方面的终极金锤是访问者模式,您可以完全消除所有条件。不是你应该,但你可以。

标签: java design-patterns solid-principles facade


【解决方案1】:

考虑一下你有希望的例子:

public static void main(String[] args) {
    SomeRandomDesignPattern pattern = new SomeRandomDesignPattern();
    pattern.execute(args);
}

代替new'ing pattern 对象,将该责任委托给辅助方法:

public static void main(String[] args) {
    SomeRandomDesignPattern pattern = new create();
    pattern.execute(args);
}

create 可以像私有帮助方法一样简单。

现在将 argsexecute 移动到辅助方法:

public static void main(String[] args) {
    SomeRandomDesignPattern pattern = new create(args);
    pattern.execute();
}

现在你有了一个众所周知的模式:Command。您所要做的就是重命名:

public static void main(String[] args) {
    Command command = new create(args);
    command.execute();
}

create 辅助方法可以查看args 来选择Command 的适当子类型返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 2016-04-15
    • 2011-05-24
    • 2011-01-31
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多