我正在构建一个名为ListView的Java Swing类,它试图成为一个通用列表。
public class ListView<T> extends JPanel {
private IListViewDataSource<T> dataSource;
private JPanel list;
public ListView(IListViewDataSource<T> dataSource, Dimension dimension) {
this.dataSource = dataSource;
list = new JPanel(new GridLayout(0, 1));
this.add(new JScrollPane(list));
this.setPreferredSize(dimension);
}
public void loadRows() {
for (int i = 0; i < dataSource.getNumberOfElements(); i++) {
JLabel label = new JLabel(dataSource.getTitleOfElement(dataSource.getElementAtPosition(i)));
list.add(label);
}
}
}
为了做到这一点,我宣布了一个名为IListViewDataSource的接口,它定义了列表视图获取数据所需的方法。
public interface IListViewDataSource<T> {
T getElementAtPosition(int position);
int getNumberOfElements();
String getTitleOfElement(T element);
}
我希望可以使用您声明的任何数据源来实例化新的ListView,以便引入列表中的任何数据。到目前为止一切都很好。
现在,我正在构建另一个名为OfferListView的类,它扩展了ListView,为了不拥有一个不需要的额外文件,我希望它实现自己的ListViewDataSource。问题是我不能在这个新类的构造函数中调用super(this, dimension)
,因为我被告知在调用超类构造函数之前不能使用this
。
这个“模式”是使用UIKit for iOS进行编程时使用的模式,我认为它非常好,但我不能让它在Java中工作。我怎么能接近这个?
答案 0 :(得分:0)
Domain-View-Controller
策略在90年代用于smaltalk以从域中分离视图,并且它仍然在Web开发中使用。
如果没有为视图等编写所有类,有两种方法可以从域中分离视图。
(1st :)当视图将某些内容传递给域对象时,它会保留polling
以检查是否有任何其他更改。这意味着一旦视图对象(文本字段,框架或其他任何东西)将请求转发到域,它会在几秒或几分钟后继续检查是否有更改。然而,这种方法并不好。
(2nd :)观察者设计模式。当一件事发生变化时,它会自动通知所有听众。您的视图必须实现一个接口,域应该提供一种方法来订阅实现该接口的所有对象。这是一个例子,我没有编译它,但它清楚地从view
分隔domain
。
public class View implements PropertyChangeListener {
private DomainObject object;
public View(DomainObject object) {
assert(object != null);
this.setObject(object);
}
public void enterText(String text) {
this.getObject().update(text);
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if(evt.getPropertyName().equals("string_updated"))
System.out.println("New value is " + evt.getNewValue());
}
public DomainObject getObject() {
return object;
}
public void setObject(DomainObject object) {
this.object = object;
}
}
这是域类:
public class DomainObject {
private String text;
public DomainObject(String test) {
this.setText(test);
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public void update(String string) {
this.setText(string);
this.getListener().stream().forEach(e -> e.propertyChange(new PropertyChangeEvent(this,"string_updated","",this.getText())));
}
private ArrayList<PropertyChangeListener> listener;
public void subscribe(PropertyChangeListener listener) {
this.getListener().add(listener);
}
public ArrayList<PropertyChangeListener> getListener() {
return listener;
}
public void setListener(ArrayList<PropertyChangeListener> listener) {
this.listener = listener;
}
}
正如我所见,你试图获得很多观点,如果它们被包含在彼此中,那么也使用Composite design pattern
。