【问题标题】:Stateful Strategy with Layout Mangager带有布局管理器的状态策略
【发布时间】:2019-01-29 17:08:31
【问题描述】:

我试图理解无状态和有状态之间的区别。

我以 Java LayoutManager 为例。通常,我不能将 BorderLayout 的实例用于多个容器。 我认为在有状态的策略中,上下文将自己作为参数传递给策略操作。这样策略就可以到达策略算法所需的所有数据。

我有一个有状态策略的代码片段。我认为这里的背景是“创建小组”,我们有不同的策略。

public class LayoutComparer extends JFrame {
   private LayoutManager layout;
   private String title;

   public static void main(String[] args) {
       JFrame f = new LayoutComparer();
       f.setDefaultCloseOperation(EXIT_ON_CLOSE);
       f.pack();
       f.setVisible(true);
   }

   static int counter = 0;

   JPanel createPanel(LayoutManager layout, String title) {
      this.layout = layout;
      this.title = title;
      JPanel p = new JPanel();
      p.setLayout(layout);
      p.add(new JButton("Click " + counter++), "West");
      p.add(new JButton("Click " + counter++), "Center");
      p.add(new JButton("Click " + counter++), "East");
      p.setBorder(BorderFactory.createTitledBorder(title));
      return p;
  }

  LayoutComparer() {
      setTitle("Layout Manager Test");
      setLayout(new GridLayout(1, 2));
      LayoutManager m;
    m = new java.awt.FlowLayout();
 // m = new java.awt.BorderLayout();

    add(createPanel(m, "Left"));
//  pack();
    add(createPanel(m, "Right"));
  }
}

【问题讨论】:

  • 你的问题是什么?
  • 很抱歉给您带来了困惑。我想知道无状态策略会是什么样子。我如何实现 LayoutManager,以便不同的容器可以使用具体的策略

标签: java design-patterns strategy-pattern stateless stateful


【解决方案1】:

简而言之,“有状态”意味着执行某些操作的实例(在您的情况下为 LayoutManager)持有超出要完成的操作范围的某些状态。如果它在操作期间保持状态,我仍然认为它是无状态的,但不一定是线程安全的。

也就是说,“无状态”实例不会保持任何“持久”状态(超出当前操作的范围),理想情况下根本不会保持任何状态,从而使其更加线程安全(可能还有其他事情需要考虑使其完全线程安全)。

对于 LayoutManager,您需要记住,它不仅会在创建组件时使用,而且还会在组件的生命周期内用于调整大小等目的。

不需要任何特殊设置或可以使用通用设置(例如 FlowLayout)的 LayoutManager 可能被认为是无状态的(我不知道它在内部使用什么),但像 BorderLayout 这样的管理器需要特定配置(例如,需要保留/保持的北、南、中心等组件,从而使 LayoutManager 有状态。

【讨论】:

    猜你喜欢
    • 2013-02-09
    • 2018-08-02
    • 2020-11-11
    • 1970-01-01
    • 2020-12-28
    • 2021-11-08
    • 2012-02-25
    • 2013-05-03
    • 1970-01-01
    相关资源
    最近更新 更多