设计模式 (七):桥接模式
ConcreteImplementor:具体实现类
这里我们还是以我们经常使用的手机为例子:
手机的抽象类:
package cn.edu.hust.bridge;
//手机抽象类
public abstract class MobilePhone {
private SOC soc;
public void setSoc(SOC soc) {
this.soc = soc;
}
//不同的手机有不同的 UI
public abstract void sayUI();
}
这里有两种手机
小米手机:
package cn.edu.hust.bridge;
public class MiPhone extends Mobile
Phone{
public void sayUI() {
System.out.println("小米手机使用的是 MIUI");
}
}
魅族手机:
package cn.edu.hust.bridge;
public class MeizuPhone extends MobilePhone {
public void sayUI() {
System.out.println("魅族使用的 UI 是 Flyme");
}
}
对于抽象的扩展类:
package cn.edu.hust.bridge;
//手机的 SOC
public abstract class SOC {
//SOC 的品牌,根据不同的 SOC 输出不同的品牌
public abstract void sayBrand();
}
现实生活中,我们有高通和联发科:
package cn.edu.hust.bridge;
public class GaoTongSOC extends SOC {
public void sayBrand() {
System.out.println("使用的是高通的 SOC");
}
}
联发科
package cn.edu.hust.bridge;
public class MTKSOC extends SOC {
public void sayBrand() {
System.out.println("使用的是联发科的 SOC");
}
}
客户端的使用如下:
package cn.edu.hust.bridge;
public class Client {
public static void main(String[] args)
{
//这里针对于小米手机
SOC gaoTongSOC=new GaoTongSOC();
MobilePhone mobilePhone=new MiPhone();
//小米手机的 SOC
mobilePhone.setSoc(gaoTongSOC);
//这个手机的 UI
mobilePhone.sayUI();
//这里针对于魅族手机
SOC mtkSOC=new MTKSOC();
MobilePhone mobilePhone1=new MeizuPhone();
mobilePhone1.setSoc(mtkSOC);
mobilePhone1.sayUI();
}
}
? 理解桥接模式,重点需要理解如何将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化。
抽象化:抽象化就是忽略一些信息,把不同的实体当作同样的实体对待。在面向对象中,将对象的共同性质抽取出来形成类的过程即为抽象化的过程。
实现化:针对抽象化给出的具体实现,就是实现化,抽象化与实现化是一对互逆的概念,实现化产生的对象比抽象化更具体,是对抽象化事物的进一步具体化的产物。
脱耦:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为关联关系。桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化,这就是桥接模式的用意。
桥接模式的优点:
评论