在java中传递abstractclass而不是对象?

时间:2011-05-10 08:31:43

标签: java oop design-patterns

我在java中使用我的MVC模型时遇到了一些问题。

我将一个Object win传递给addModal方法,以便我可以在我的上下文菜单中使用任何窗口或基本上任何类型的操作,并在我的handelAction方法中处理它。但是,我知道它不是最好的传递对象从那时起我们使用所有的java所以我的问题是这个

我可以创建某种抽象包装类而不是Object吗?

请注意,我的所有视图都扩展了AbstractView,因此我不能简单地扩展这些视图,第二件事需要注意的是,我不能简单地传入AbstractView,因为它不是总是会被视为我想要显示一旦行动发生。

没有详细说明,这是我现在的一些测试代码:

public void addModal(Action action, Object win, ACTION_CONTEXT_MENU menuSelection){

    switch(menuSelection){
    case SINGLE: 
        singleActions.put(action, win);
        print("singleActions added");
        break;
    case MULTI:
        multiActions.put(action, win);
        print("multiActions added");
        break;
    default: 
        singleActions.put(action, win);
        multiActions.put(action, win);
        print("defaultActions added");
        break;
    }
}

public void handleAction(Action action, Object sender, Object target) {
    if(view.getSelectedRows().size() > 1){
        if(multiActions.get(action) instanceof ModalWindowView){
            print("multi we have an instance of modalwindowview");
            ((ModalWindowView) multiActions.get(action)).showWindow();
        }else{
            view.getTable().setEditable(true);
        }
    }else{
        if(singleActions.get(action) instanceof ModalWindowView){
            print("single we have an instance of modalwindowview");
            ((ModalWindowView) singleActions.get(action)).showWindow();
        }else{
            view.getTable().setEditable(true);
        }
    }


}

public class TestEditTableCrap extends VerticalLayout{

    public TestEditTableCrap(Container container){
        EditTableModel model = new EditTableModel();
        EditTableController controller = new EditTableController();
        EditTableView editTableView = (EditTableView)controller.requestView(model);//this returns an EditTableView
        editTableView.registerEventListener(controller);
        //editTableView.addActionHandler(controller);
        //editTableView.addShortcutListener(controller.getExtendedShortcutListener("enter", KeyCode.ENTER));

        editTableView.setContainerDataSource(container);

        RegistryIdEditTable registryIdTable;

        ContactView view = null;
        addComponent(editTableView.getTable());

        ModalWindowModel winModelNew = new ModalWindowModel(MODAL_SETTINGS.NEW_MODAL_WINDOW);
        ModalWindowModel winModelEdit = new ModalWindowModel(MODAL_SETTINGS.EDIT_MODAL_WINDOW);
        ModalWindowModel winModelDelete = new ModalWindowModel(MODAL_SETTINGS.DELETE_MODAL_WINDOW);

        ModalWindowController winController = new ModalWindowController();
        ModalWindowController winController2 = new ModalWindowController();
        ModalWindowController winController3 = new ModalWindowController();

        ModalWindowView winViewNew = (ModalWindowView)winController.requestView(winModelNew);
        ModalWindowView winViewEdit = (ModalWindowView)winController2.requestView(winModelEdit);
        ModalWindowView winViewDelete = (ModalWindowView)winController3.requestView(winModelDelete);

        controller.addModal(new Action("New"), winViewNew, ACTION_CONTEXT_MENU.ALL);
        controller.addModal(new Action("Modify all selections"), winViewEdit, ACTION_CONTEXT_MENU.MULTI);
        controller.addModal(new Action("Delete"), winViewDelete, ACTION_CONTEXT_MENU.ALL);

    }
}

跟进问题:是否存在执行此类操作的模式?在已经扩展新Abstract类中的其他抽象类的类中包装?

3 个答案:

答案 0 :(得分:3)

我建议使用界面代替。定义明确,它也应该消除instanceof检查。

答案 1 :(得分:1)

interface

的原因

答案 2 :(得分:1)

如果您想避免广泛使用instanceof,可以实现visitor pattern

您的handleAction可以放入访问者类中,使用双调度来确定应该访问哪种窗口类型,允许您在访问者类中使用方法重载而不是instanceof。