package com.cheng.zenofdesignpatterns.perfectworld.observer_mediator; import android.view.View; import com.cheng.zenofdesignpatterns.ZoDPChapterBaseActivity; public class ZoDPObserverMediatorActivity extends ZoDPChapterBaseActivity { @Override protected void initData() { mTitleTV.setText("观察者模式 + 中介者模式"); String content = "小结:\n" + "看看该案例中使用了哪些设计模式:\n" + "- 工厂方法模式\n" + "负责产生产品对象,方便产品的修改和扩展,并且实现了产品和工厂的紧耦合,避免产品随" + "意被创建而无触发事件的情况发生。\n" + "- 桥梁模式\n" + "在产品和事件两个对象的关系中使用了桥梁模式,如此设计后,两者都可以自由地扩展(前" + "提是需要抽取抽象化)而不会破坏原有的封装。\n" + "- 观察者模式\n" + "观察者模式解决了事件如何通知处理者的问题,而且观察者模式还有一个优点是可以有多个" + "观察者,也就是我们的架构是可以有多层级、多分类的处理者。想重新扩展一个新类型(新" + "接口)的观察者?没有问题,扩展ProductEvent即可。\n" + "- 中介者模式\n" + "事件有了,处理者也有了,这些都会发生变化,并且处理者之间也有耦合关系,中介者则可" + "以完美地处理这些复杂的关系。\n" + "再来思考一下,如果要扩展这个框架,可能还会用到什么模式?首先是责任链模式,它可以" + "帮助我们解决一个处理者处理多个事件的问题;其次是模板方法模式,处理者的启用、停用" + "等,都可以通过模板方法模式来实现;再次是装饰模式,事件的包装、处理者功能的强化都" + "会用到装饰模式。\n\n" + "单来源调用:\n" + "一个对象只能由固定的对象初始化的方法就叫做单来源调用(SingleCall)。\n" + "注意\n" + "采用单来源调用的两个对象一般是组合关系,两者有相同的生命期,它通常适用于有单例模" + "式和工厂方法模式的场景中。\n"; mContentTV.setText(content); } @Override public void onClick(View v) { // 使用观察者模式和中介者模式模拟事件触发器的开发 // 获得事件分发中心 EventDispatch dispatch = EventDispatch.getEventDispathc(); // 接受乞丐对事件的处理 dispatch.registerCustomer(new Beggar()); // 接受平民对事件的处理 dispatch.registerCustomer(new Commoner()); // 接受贵族对该事件的处理 dispatch.registerCustomer(new Nobleman()); // 建立一个原子弹生产工厂 ProductManager factory = new ProductManager(); // 制造一个产品 System.out.println("=====模拟创建产品事件========"); System.out.println("创建一个叫做小男孩的原子弹"); Product p = factory.createProduct("小男孩原子弹"); // 修改一个产品 System.out.println("\n=====模拟修改产品事件========"); System.out.println("把小男孩原子弹修改为胖子号原子弹"); factory.editProduct(p, "胖子号原子弹"); // 再克隆一个原子弹 System.out.println("\n=====模拟克隆产品事件========"); System.out.println("克隆胖子号原子弹"); factory.clone(p); // 销毁一个产品,销毁地点地球人都知道 System.out.println("\n=====模拟销毁产品事件========"); System.out.println("遗弃胖子号原子弹"); factory.abandonProduct(p); } }