GoF设计模式之十七 Mediator- -

来源:百度文库 编辑:神马文学网 时间:2024/04/28 04:32:48

 

                                      

    C5) Mediator(中介模式)
    定义:定义一个封装了一系列对象如何相互作用的对象。中介模式通过防止这些对象对彼此明确的涉及来获得松散的耦合,让你可以独立的改变他们的相互作用。
    从定义就能理解这个模式的含义了,这是一个很有趣的模式,不过实际中运用的机会不太多。假设一个项目,3个人写业务逻辑,2个人做客户界面,2个人负责测试,那么组长就是一个中介。A完成一个程序P的逻辑部分,通知组长;组长查看对应的界面部分,如果B完成了,就通知C进行测试;C发现有bug,通知组长,组长转告A、B进行修正。如果B正好休息没上班,那么组长会安排E来进行修正。A、B、C或者更多组员之间无需知道彼此的状态,甚至不用知道组里面还有谁(做过外包应该有些了解的,几个部门或者公司联合开发时候就是这样),任何变化都组员都不用知道,只用关心自己的工作并与组长进行沟通,相互协作的关系由组长掌握。
    常有可能用到这个模式的一般是对界面对象的访问设置,比如安装一个多媒体软件,有个下拉框,有几种默认设置:最小安装、推荐安装、全部安装、用户自定义,对应设置:核心、视频解码插件、音频解码插件、视频编码插件、音频编码插件、视频转换工具、音频转换工具、皮肤(skin)。那么就这样一个例子,用代码来实现中介模式。
    public class setupMode {
        private Console console = getConsole();
        private String modeName;
        private boolean selected = false;
        public void select() {
            setSelected(true);
            console.selectMode(modeName);
        }
    }
    public class setupItem {
        private Console console = getConsole();
        private String itemName;
        private boolean checked = false;
        public void check() {
            setChecked(true);
            console.checkItem(itemName);
        }
    }
    public class Console {
        public void selectMode(String modeName) {
            setAllModeFalseExcept(modeName);
            if ("minMode".equals(modeName)) {
                items.setAllChecked(false);
                items.get("Core").setChecked(true);
                items.get("VideoDecode").setChecked(true);
                items.get("AudioDecode").setChecked(true);
            }else if ("commonMode".equals(modeName)) {
                items.setAllChecked(false);
                items.get("Core").setChecked(true);
                items.get("VideoDecode").setChecked(true);
                items.get("AudioDecode").setChecked(true);
                items.get("VideoTool").setChecked(true);
                items.get("AudioTool").setChecked(true);
            }else if ("maxMode".equals(modeName)) {
                items.setAllChecked(true);
            }else if ("customMode".equals(modeName)) {
                //do nothing
            }
        }
        public void checkItem(String itemName) {
            modes.get("customMode").setSelected(true);
            selectMode("customMode");
        }
    }

    这样就可以由菜单控制选项,同时选项也控制菜单,如果要添加菜单或者选项,只需修改Console类,其他类没有一点影响,如果不是用这种模式,修改的工作量与类的数量成正比。