JSF
素面
.
SearchDetailView<C extends BaseView, M>
为了将通用功能集中到
搜索/详细信息
MyView
这扩大了基础
SearchDetailView
.
现在,我想向中添加另一个行为
.
我必须使用什么设计模式?
室内装修设计师
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> {
[...]
}
但是我想分开
确认对话框装饰器
从…起
.
有什么想法吗?谢谢
更新:
正如两个答案中所建议的,我使用了Java8默认方法(
混合模式
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>