需求
设计一个手机游戏。
实现
级别1
public abstract class HandsetBrand { public void Run() { } }
public class HandsetBrandA extends HandsetBrand { }
public class HandsetBrandB extends HandsetBrand { }
public class HandsetBrandAGame extends HandsetBrandA { public void Run() { System.out.println("运行A品牌手机游戏"); } }
public class HandsetBrandBGame extends HandsetBrandB { public void Run() { System.out.println("运行B品牌手机游戏"); } }
public class HandsetBrandAList extends HandsetBrandA { public void Run() { System.out.println("运行A品牌手机通讯录"); } }
public class HandsetBrandBList extends HandsetBrandB { public void Run() { System.out.println("运行B品牌手机通讯录"); } }
public class Main { public static void main(String[] args) { HandsetBrand ab; ab=new HandsetBrandAList(); ab.Run(); ab=new HandsetBrandAGame(); ab.Run(); ab=new HandsetBrandBList(); ab.Run(); ab=new HandsetBrandBGame(); ab.Run(); } }这样写的话要是增加手机功能或是增加手机品牌都会产生很大的影响。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。根据 合成复用原则应该尽量使用合成,尽量不适用继承。这样有助于保持每个类被封装并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。
public abstract class HandsetSoft { public void Run() { } }
public class HandsetList extends HandsetSoft { public void Run() { System.out.println("运行手机通讯录"); } }
public class HandsetGame extends HandsetSoft { public void Run() { System.out.println("运行手机游戏"); } }
public class HandsetBrand { protected HandsetSoft soft; public void SetHandsetSoft(HandsetSoft soft) { this.soft=soft; } public void Run() { } }
public class HandsetBrandA extends HandsetBrand { public void Run() { soft.Run(); } }
public class HandsetBrandB extends HandsetBrand { public void Run() { soft.Run(); } }
public class Main { public static void main(String[] args) { HandsetBrand ab; ab=new HandsetBrandA(); ab.SetHandsetSoft(new HandsetGame()); ab.Run(); ab.SetHandsetSoft(new HandsetList()); ab.Run(); ab=new HandsetBrandB(); ab.SetHandsetSoft(new HandsetGame()); ab.Run(); ab.SetHandsetSoft(new HandsetList()); ab.Run(); } }桥接模式,将抽象化与实现化脱耦,使得二者可以独立地变化。这句话有三个关键词:抽象化、实现化和脱耦。存在于多个实体中的共同的概念性联系,就是抽象化;抽象化给出的具体实现,就是实现化;所谓耦合,就是两个实体的行为的某种强关联,而将它们的强关联去掉,就是脱耦。在这里,脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联。将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联。这里所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用组合关系而不是继承关系,从而使两者可以相对独立地变化。