设计模式,以丰富的新功能类[关闭]

问题描述 投票:1回答:2

我已实施了一系列的课程与JSF和PrimeFaces来管理搜索/详细信息页面。更详细地说,我为了集中搜索/详细信息页的常用功能创建一个抽象类SearchDetailView<C extends BaseView, M>

总之,我有一个扩展底座MyViewSearchDetailView。现在,我想添加其他行为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>
java oop design-patterns decorator-pattern
2个回答
3
投票

我将使用设计模式装饰,但我并不需要在运行时添加新的行为,但我已经知道什么样的行为需要MyView的。

接着

我想,以增加“动态”的额外功能,以创建像ConfirmDialogDecorator第二抽象类。

你不说这事,自己的反面? 你知道在编译时装饰的可能性,但这并不意味着该模式不适合。

但是我想从ConfirmDialogDecorator分离SearchDetailView。

装饰也是继承和避免类层级的替代品。 通过引入装饰器接口使用的模式可能是为你的需求的正确途径。

作为替代的Java 8中引入的界面默认的方法的概念,即允许添加行为实现它的类。 在某种程度上,我们可以把它作为一种静态装饰用额外的行为类没有子。请注意,因为接口不能定义实例字段,默认的方法也不能使用它。所以,你应该根据这个约束考虑这个选择。


1
投票

通常在没有继承功能添加到一个类中使用mixim/trait概念。

您可以使用default methods或纵横反对编程在Java中这一概念的实施

© www.soinside.com 2019 - 2024. All rights reserved.