目录
1.基本介绍
2.动机
3.类图
4.案例
5.总结
案例:手机操作问题
需求:
现在对不同手机类型的不同品牌实现操作编程(比如开机,关机,上网,打电话等),如图传统方式设计:
分析问题:
扩展性问题:当我们要增加一个新的样式,就需要在它下面增加对应的三种品牌的手机;当我们要增加一种手机,就需要在每个样式下面增加该手机违反了单一原则,当我们增加手机样式时,要同时增加所有品牌的手机桥接模式实现:
实现类:
Brand.java
package cn.cqu.bridge; public interface Brand { void open(); void close(); void call(); }XiaoMi.java
package cn.cqu.bridge; public class XiaoMi implements Brand{ @Override public void open() { System.out.println("小米手机开机了"); } @Override public void close() { System.out.println("小米手机关机了"); } @Override public void call() { System.out.println("小米手机打电话了"); } }Vivo.java
package cn.cqu.bridge; public class Vivo implements Brand{ @Override public void open() { System.out.println("Vivo手机开机了"); } @Override public void close() { System.out.println("Vivo手机关机了"); } @Override public void call() { System.out.println("Vivo手机打电话了"); } }抽象类:
Phone.java
package cn.cqu.bridge; public abstract class Phone { protected Brand brand; public Phone(Brand brand) { this.brand = brand; } protected void open(){ this.brand.open(); } protected void close(){ this.brand.close(); } protected void call(){ this.brand.call(); } }FolderPhone.java
package cn.cqu.bridge; public class FolderPhone extends Phone { public FolderPhone(Brand brand) { super(brand); } //这里的open先找到抽象类Phone的open, // Phone中的open通过组合的Brand接口调用Brand的实现类的open @Override protected void open() { super.open(); System.out.println("折叠样式手机"); } @Override protected void close() { super.close(); System.out.println("折叠样式手机"); } @Override protected void call() { super.call(); System.out.println("折叠样式手机"); } }UpRightPhone.java
package cn.cqu.bridge; public class UpRightPhone extends Phone{ public UpRightPhone(Brand brand) { super(brand); } @Override protected void open() { super.open(); System.out.println("直立样式手机"); } @Override protected void close() { super.close(); System.out.println("直立样式手机"); } @Override protected void call() { super.call(); System.out.println("直立样式手机"); } }Client.java
package cn.cqu.bridge; public class Client { public static void main(String[] args) { //获取折叠式手机(样式+品牌) Phone phone1 = new FolderPhone(new XiaoMi()); phone1.open(); phone1.call(); phone1.close(); System.out.println("======================="); //获取直立样式手机(样式+品牌) Phone phone2 = new FolderPhone(new Vivo()); phone2.open(); phone2.call(); phone2.close(); } } 我们不管要增加手机样式还是增加手机品牌,我们只需要去添加一个类继承对应的父类即可,而不用去修改其他的子类