代码之家  ›  专栏  ›  技术社区  ›  Alessandro

用新功能丰富课堂的设计模式[已关闭]

  •  1
  • Alessandro  · 技术社区  · 6 年前

    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>
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   davidxxx    6 年前

    我本来打算使用设计模式装饰器,但我不需要 在运行时添加新行为,但我已经知道了哪些行为 MyView需要。

    然后

    我想创建第二个抽象类,如ConfirmDialogDecorator 为了“动态地”添加额外的功能。

    你不说一件事和它相反吗?
    您知道在编译时进行装饰的可能性,但这并不意味着该模式不适合。

    但我想将ConfirmDialogDecorator与SearchDetailView分开。


    通过引入decorator接口来使用该模式可能是满足您需求的正确方法。

    作为替代方案,Java8在接口中引入了默认方法的概念,允许向实现它的类添加行为。
    静态地 没有子类化的具有附加行为的类。注意,由于接口不能定义实例字段,默认方法也不能使用它。所以你应该根据这个约束考虑这个替代方案。

        2
  •  1
  •   Maksym Fedorov    6 年前

    通常情况下,在没有继承的情况下向类添加功能将被使用 mixim/trait 构思

    default methods 或者Java中面向方面的编程来实现这个概念