我已实施了一系列的课程与JSF和PrimeFaces来管理搜索/详细信息页面。更详细地说,我为了集中搜索/详细信息页的常用功能创建一个抽象类SearchDetailView<C extends BaseView, M>
。
总之,我有一个扩展底座MyView
类SearchDetailView
。现在,我想添加其他行为MyView
,那就是确认对话框。
我不知道我要使用什么设计模式?我将使用设计模式装饰,但我并不需要在运行时添加新的行为,但我已经知道哪些行为MyView
需要。
我不能伸出两个类(明显),但我不喜欢有“基地”类的多种组合。我想,以增加“编程”额外的功能来创建像ConfirmDialogDecorator
第二抽象类。
于是,我问你这设计模式添加行为的一类?
其实我的代码是这样的:
public abstract class SearchDetailView<C extends BaseController, M> extends BaseView {
[...]
}
public abstract class ConfirmDialogDecorator<C extends BaseController, M> extends SearchDetailView<C, M> {
public void showDialog(final String message) { [...] }
}
public class MyView extends ConfirmDialogDecorator<MyController, MyModel> {
[...]
}
但是我想从ConfirmDialogDecorator
分离SearchDetailView
。任何想法?谢谢。
更新:由于我使用的Java 8默认方法两个答案建议(密新模式?):
public interface ConfirmDialog {
Dialog dialog = new Dialog();
default public String getConfirmMessage() {
return "Do you confirm?";
}
default String getWidgetVar() {
return "confirmDialog";
}
public void onConfirm();
default void showDialog(final String message) {
dialog.setWidgetVar(this.getWidgetVar());
dialog.setMessage(message);
dialog.showDialog(message);
}
class Dialog {
private String message;
private String widgetVar;
String getMessage() {
return message;
}
void setMessage(final String message) {
this.message = message;
}
public String getWidgetVar() {
return widgetVar;
}
public void setWidgetVar(final String widgetVar) {
this.widgetVar = widgetVar;
}
void showDialog(final String message) {
final PrimeFaces current = PrimeFaces.current();
current.executeScript("PF('" + this.widgetVar + "').show();");
}
}
}
public class MyView extends SearchDetailView<MyController, MyModel>
implements ConfirmDialog {
public void onSave() {
if(!this.someCheck()) {
this.showDialog("Are you really sure?");
} else {
this.save();
}
}
@Override
public void onConfirm() {
this.save();
}
public void save() {
// The save
}
}
在XHTML:
<p:confirmDialog widgetVar="confirmDialog" global="true">
<h:outputText value="#{myView.confirmMessage}" />
<p:commandButton value="Yes" type="button" styleClass="ui-confirmdialog-yes" icon="pi pi-check" />
<p:commandButton value="No" type="button" styleClass="ui-confirmdialog-no" icon="pi pi-times" />
</p:confirmDialog>
我将使用设计模式装饰,但我并不需要在运行时添加新的行为,但我已经知道什么样的行为需要MyView的。
接着
我想,以增加“动态”的额外功能,以创建像ConfirmDialogDecorator第二抽象类。
你不说这事,自己的反面? 你知道在编译时装饰的可能性,但这并不意味着该模式不适合。
但是我想从ConfirmDialogDecorator分离SearchDetailView。
装饰也是继承和避免类层级的替代品。 通过引入装饰器接口使用的模式可能是为你的需求的正确途径。
作为替代的Java 8中引入的界面默认的方法的概念,即允许添加行为实现它的类。 在某种程度上,我们可以把它作为一种静态装饰用额外的行为类没有子。请注意,因为接口不能定义实例字段,默认的方法也不能使用它。所以,你应该根据这个约束考虑这个选择。
通常在没有继承功能添加到一个类中使用mixim/trait概念。
您可以使用default methods或纵横反对编程在Java中这一概念的实施