桥接模式

  • 桥接模式是什么?
  • 桥接模式解决什么问题?
  • 桥接模式实现

桥接模式是什么?

将抽象部分与它的实现部分分离,使它们都可以独立地变化

桥接模式解决什么问题?

当有手机品牌A和B

public class PhoneBrand {public void run() {}}class PhoneBrandA extends PhoneBrand {}class PhoneBrandB extends PhoneBrand {}

每个手机品牌都拥有游戏和通讯录功能

class PhoneBrandAGame extends PhoneBrandA{@Overridepublic void run() {System.out.println("运行品牌A的游戏");}}class PhoneBrandBGame extends PhoneBrandB{@Overridepublic void run() {System.out.println("运行品牌B的游戏");}}class PhoneBrandAAddressList extends PhoneBrandA{@Overridepublic void run() {System.out.println("运行品牌A的通讯录");}}class PhoneBrandBAddressList extends PhoneBrandB{@Overridepublic void run() {System.out.println("运行品牌B的通讯录");}}

调用时

new PhoneBrandAGame().run();new PhoneBrandBGame().run();new PhoneBrandAAddressList().run();new PhoneBrandBAddressList().run();
  • 当新增功能时,每个品牌都要新增一个类

  • 当新增品牌时,每个功能也要新增一个类

桥接模式实现

创建Soft及其子类游戏和通讯录功能

abstract class Soft {abstract void run();}class Game extends Soft {@Overridevoid run() {System.out.println("游戏");}}class AddressList extends Soft {@Overridevoid run() {System.out.println("通讯录");}}

创建品牌类,将Soft作为域

abstract class Brand {protected Soft mSoft;public void setSoft(Soft soft) {mSoft = soft;}abstract void run();}class BrandA extends Brand{@Overridevoid run() {System.out.print("运行品牌A的");mSoft.run();}}class BrandB extends Brand{@Overridevoid run() {System.out.print("运行品牌B的");mSoft.run();}}

调用过程

BrandA brandA = new BrandA();brandA.setSoft(new Game());brandA.run();BrandB brandB = new BrandB();brandB.setSoft(new Game());brandB.run();brandA.setSoft(new AddressList());brandA.run();brandB.setSoft(new AddressList());brandB.run();

当新增功能或品牌时,只需要新增一个类,不会影响其他的类