布局管理器的状态策略
Stateful Strategy with Layout Mangager
我试着理解无状态和有状态的区别。
我以 Java LayoutManager 为例。通常我不能为多个容器使用一个实例,例如 BorderLayout。
我认为在有状态策略中,上下文将自身作为参数传递给策略操作。这样策略就可以到达策略算法所需的所有数据。
我有一个状态策略的代码片段。我认为这里的上下文是 "creation of the panel",对此我们有不同的策略。
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"));
}
}
简而言之,"stateful" 意味着执行某些操作的实例(在您的情况下为 LayoutManager)保持一些超出要完成的操作范围的状态。如果它在操作期间保持状态,我仍然认为它是无状态的,但不一定是线程安全的。
也就是说 "stateless" 实例不会保持任何 "persistent" 状态(超出当前操作的范围)并且理想情况下根本不会保持任何状态,从而使其更加线程安全(可能有需要考虑的其他事项才能使其完全线程安全)。
对于 LayoutManager,您需要记住,它不仅会在创建组件时使用,还会在组件的生命周期内用于调整大小等目的。
不需要任何特殊设置或可以使用通用设置(例如 FlowLayout)的 LayoutManager 可能被认为是足够无状态的(我不知道它在内部使用什么)但是管理器喜欢 BorderLayout
需要特定配置(例如北、南、中心等组件)需要 kept/hold 从而使 LayoutManager 有状态。
我试着理解无状态和有状态的区别。
我以 Java LayoutManager 为例。通常我不能为多个容器使用一个实例,例如 BorderLayout。 我认为在有状态策略中,上下文将自身作为参数传递给策略操作。这样策略就可以到达策略算法所需的所有数据。
我有一个状态策略的代码片段。我认为这里的上下文是 "creation of the panel",对此我们有不同的策略。
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"));
}
}
简而言之,"stateful" 意味着执行某些操作的实例(在您的情况下为 LayoutManager)保持一些超出要完成的操作范围的状态。如果它在操作期间保持状态,我仍然认为它是无状态的,但不一定是线程安全的。
也就是说 "stateless" 实例不会保持任何 "persistent" 状态(超出当前操作的范围)并且理想情况下根本不会保持任何状态,从而使其更加线程安全(可能有需要考虑的其他事项才能使其完全线程安全)。
对于 LayoutManager,您需要记住,它不仅会在创建组件时使用,还会在组件的生命周期内用于调整大小等目的。
不需要任何特殊设置或可以使用通用设置(例如 FlowLayout)的 LayoutManager 可能被认为是足够无状态的(我不知道它在内部使用什么)但是管理器喜欢 BorderLayout
需要特定配置(例如北、南、中心等组件)需要 kept/hold 从而使 LayoutManager 有状态。