桥接模式是软件设计模式中最复杂的模式之一,它把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。事物对象仅是一个抽象的概念。如“圆形”、“三角形”归于抽象的“形状”之下,而“画圆”、“画三角”归于实现行为的“画图”类之下,然后由“形状”调用“画图”。
手机都有自己的系统,一种做法是有个手机类,他又字段设备名称,以及打电话发短信等行为。伪代码如下
public abstract class phone{
设备名字段;
设备参数;
打电话抽象方法()
}
系统中iphone手机和小米mix分别继承该类,并实现相关方法。但是这时候行为就与设备绑定。我们不能再iphone的手机上使用小米特有的打电话方法。然而,有种行为叫做刷机,这时候代码的维护就变得异常的困难了,这时候如果操作系统和手机分开那就完美了,这时桥接模式就体现了他的作用,桥接模式将操作系统这个抽象的东西和设备(你手上的phone手机和mix手机)桥接起来。使他成为一部完整可用的手机。
首先我们需要一个设备,这个设备兼备了所有手机的通用功能,但是手机必须有系统才能用,但是这个系统是可替换的。手机对外的功能最后又系统完成。因此代码如下。
/**
* 设备-对象最高层级
*
* Created by Administrator on 2018/5/30 0030.
*/
public class Device {
//系统
private System product;
protected Device(System product) {
this.product = product;
}
private void email(){
product.email();
}
private void internet(){
product.internet();
}
private void phone(){
product.phone();
}
public final void user(){
email();
internet();
phone();
}
}
各个手机品牌由又自己的系统,虽然功能是一样的, 因此系统必定是抽象的一个大概,各个厂家分别具体实现。
/**
* 系统
* Created by Administrator on 2018/5/30 0030.
*/
public interface System {
public void email();
public void internet();
public void phone();
}
现在有个来个iphone的ios系统。
/**
* Created by Administrator on 2018/5/30 0030.
*/
public class Iphone implements System {
@Override
public void email() {
java.lang.System.out.println("iphone email..");
}
@Override
public void internet() {
java.lang.System.out.println("iphone email..");
}
@Override
public void phone() {
java.lang.System.out.println("iphone email..");
}
}
手机必然是继承设备,因为手机是一个对象,他和系统是没什么关系。
/**
* Created by Administrator on 2018/5/30 0030.
*/
public class Mix extends Device {
public Mix(System product) {
super(product);
}
//添加mix自己的都有功能
}
我上个星期买了mix,不过我想刷机成ios系统,好,我们来开始刷机操作。
Device product = new Mix(new Iphone());
product.user();
完成!就是这么简单。
如果要重新刷机成为mix自己的系统,那么只要把创建mix自己的系统类,继承System接口,然后
Device product = new Mix(new MixSyste());
product.user();
就是这么简单,在设备完全没有任何更改情况下,我们将对象的行为变更了。
其中桥接最关键的地方就在于Device类的product字段,这个字段桥接了对象与行为的。
我们甚至可以在任何的设备上使用任何的系统,只要你讲她们桥接起来了。
因此设备与系统是可以单独变化的,它也在不影响客户端的代码情况下改变了内部实现。可以说这种集合关系将耦合降低到了最低。