java - 使用新功能丰富类的设计模式

标签 java oop design-patterns decorator

<分区>

我已经使用 JSFPrimeFaces 实现了一系列类来管理搜索/详细信息页面。 更详细地说,我创建了一个抽象类 SearchDetailView<C extends BaseView, M>为了集中搜索/详细信息页面的通用功能。

简而言之,我有一个类MyView扩展基地 SearchDetailView . 现在我想向 MyView 添加另一个行为,即确认对话框

我想知道我必须使用什么设计模式?我打算使用设计模式Decorator,但我不需要添加新的行为运行时,但我已经知道什么行为 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 默认方法(Mixin 模式?):

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>

最佳答案

I was going to use the design pattern Decorator, but I don't need to add new behaviors at runtime, but I've already know what behaviors MyView needs.

然后

I'd like to create a second abstract class like ConfirmDialogDecorator in order to add "dynamically" the extra functionality.

难道你说的不是一回事吗?
您知道在编译时装饰的可能性这一事实并不意味着该模式不适用。

But I'd like to separate ConfirmDialogDecorator from SearchDetailView.

装饰器也是子类化和避免类层次结构的替代方法。
通过引入装饰器接口(interface)来使用模式可能是满足您要求的正确方法。

作为替代方案,Java 8 在接口(interface)中引入了默认方法的概念,允许向实现它的类添加行为。
在某种程度上,我们可以将其视为一种用附加行为装饰静态类而无需子类化的方法。请注意,由于接口(interface)无法定义实例字段,因此默认方法也无法使用它。所以你应该根据这个约束来考虑这个替代方案。

关于java - 使用新功能丰富类的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54530412/

相关文章:

java - 初始化套接字上的ObjectInputStream block

java - 必须扩展类 A 并实现一些接口(interface)的成员变量

c# - .Net中的接口(interface)标准化

java - 如何解决先有鸡还是先有蛋的问题?

java - 在 Netbeans Web 应用程序中使用小程序

php - 将 PHP 对象传递给 ajax PHP 脚本

php - 需要帮助使 PDO 准备好的语句更安全

仅包含公共(public)函数的 C++ 类

python - 设计复杂的数据结构依赖

java - 寻找不可约分数