package com.cheng.zenofdesignpatterns.patterns.bridge; import android.view.View; import com.cheng.zenofdesignpatterns.ZoDPChapterBaseActivity; import com.cheng.zenofdesignpatterns.patterns.bridge.common.Abstraction; import com.cheng.zenofdesignpatterns.patterns.bridge.common.ConcreteImplementor1; import com.cheng.zenofdesignpatterns.patterns.bridge.common.Implementor; import com.cheng.zenofdesignpatterns.patterns.bridge.common.RefinedAbstraction; import com.cheng.zenofdesignpatterns.patterns.bridge.corporation.Clothes; import com.cheng.zenofdesignpatterns.patterns.bridge.corporation.House; import com.cheng.zenofdesignpatterns.patterns.bridge.corporation.HouseCorp; import com.cheng.zenofdesignpatterns.patterns.bridge.corporation.IPod; import com.cheng.zenofdesignpatterns.patterns.bridge.corporation.ShanZhaiCorp; public class ZoDPBridgeActivity extends ZoDPChapterBaseActivity { @Override protected void initData() { mTitleTV.setText("桥梁模式"); String content = "定义:\n" + "Decouple an abstraction from its implementation so that the two can vary " + "independently.\n" + "将抽象和实现解耦,使得两者可以独立地变化。\n\n" + "桥梁模式的优点\n" + "- 抽象和实现分离\n" + "这也是桥梁模式的主要特点,它完全是为了解决继承的缺点而提出的设计模式。在该模式下," + "实现可以不受抽象的约束,不用再绑定在一个固定的抽象层次上。\n" + "- 优秀的扩充能力\n" + "- 实现细节对客户透明\n" + "客户不用关心细节的实现,它已经由抽象层通过聚合关系完成了封装。\n\n" + "使用场景\n" + "- 不希望或不适用使用继承的场景\n" + "例如继承层次过多、无法更细化设计颗粒等场景,需要考虑使用桥梁模式。\n" + "- 接口或抽象类不稳定的场景\n" + "- 重用性要求较高的场景\n" + "设计的粒度越细,则被重用的可能性就越大,而采用继承则受父类的限制,不可能出现太细的" + "颗粒度。\n\n" + "注意事项\n" + "使用该模式时主要考虑如何拆分抽象和实现,并不是一涉及继承就考虑使用该模式,那还要继承" + "干什么呢?桥梁模式的意图还是对变化的封装,尽量把可能变化的因素封装到最细、最小的逻辑" + "单元中,避免风险扩散。在进行系统设计时,发现类的继承有N层时,可以考虑使用桥梁模式。\n\n" + "最佳实践\n" + "继承非常好,但是有缺点,可以扬长避短,对于比较明确不发生变化的,则通过继承来完成;若" + "不能确定是否会发生变化的,那就认为会发生变化,则通过桥梁模式来解决,这才是一个完美的世界。"; mContentTV.setText(content); } @Override public void onClick(View v) { // 1. 模拟公司生产产品赚钱 House house = new House(); System.out.println("-------房地产公司是这个样子运行的-------"); // 先找到房地产公司 HouseCorp houseCorp = new HouseCorp(house); // 看我怎么挣钱 houseCorp.makeMoney(); System.out.println(); // 山寨公司生产的产品很多,不过我只要指定产品就成了 System.out.println("-------山寨公司是这样运行的-------"); ShanZhaiCorp shanZhaiCorp = new ShanZhaiCorp(new Clothes()); shanZhaiCorp.makeMoney(); shanZhaiCorp = null; shanZhaiCorp = new ShanZhaiCorp(new IPod()); shanZhaiCorp.makeMoney(); // 2. 通用桥梁模式演示 /** * 桥梁模式中的几个名词比较拗口,只要记住一句话就成:抽象角色引用实现角色,或者说 * 抽象角色的部分实现是由实现角色完成的 */ // 定义一个实现化角色 Implementor imp = new ConcreteImplementor1(); // 定义一个抽象化角色 Abstraction abs = new RefinedAbstraction(imp); // 执行行文 abs.request(); } }