维基百科:桥接模式是软件设计模式中最复杂的模式之一,它把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。
百度百科:桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(interface)模式。
桥接(Bridge)模式包含以下主要角色:
**举个:**假设有一个歌手,他的名字叫磊磊。磊磊会用嘴唱歌,磊磊会边弹吉他边唱歌。但是磊磊是个十分好学的孩子不满足于现状,于是他报了个机构叫白马教育,并且成为了Good Singer班中的一员。在进行了长达两年半的学习之后,磊磊凭借着过人的天赋学会了边弹钢琴边唱歌。
如何实现???
a.传统思路:
定义一个演员类,将用嘴唱歌,用吉他唱歌,用钢琴唱歌写到这个类中。
缺点很明显,如果又来了一个人怎么办,如果又学会的一个乐器怎么办,显然不易扩展。
b.桥接模式思路:
在抽象类中:
1.将需要桥接的接口拿到父类里
2.直接将接口属性丢到构造方法里,同时要在子类构造该方法
3.调用桥接属性开始“表演”
代码演示:
1.定义抽象演员类(Perfomer)
package com.qf.bridge;
/**
* @author ###
*/
public abstract class Perfomer{
//桥接属性
protected IplayType playType;
//构造表演方法
public Perfomer(IplayType playType){
this.playType=playType;
}
//表演
abstract protected void perform();
}
2.定义磊磊类,继承抽象演员类
package com.qf.bridge;
public class Leilei extends Perfomer{
//构造方法传递需要的乐器表演方式
public Leilei(IplayType playType) {
super(playType);
}
@Override
protected void perform() {
playType.play("磊磊");
}
}
3.设计乐器表演接口,包含一个play方法
package com.qf.bridge;
//表演方式
public interface IplayType{
void play(String name);
}
4.定义吉他表演类遵从乐器表演接口
package com.qf.bridge;
public class Guitar implements IplayType {
@Override
public void play(String name) {
System.out.println(name+"用吉他唱歌了");
}
}
5.定义嘴巴类遵从乐器表演类
package com.qf.bridge;
public class Mouth implements IplayType{
@Override
public void play(String name) {
System.out.println(name+"用嘴唱歌了");
}
}
6.Test
package com.qf.bridge;
public class Demo1 {
public static void main(String[] args) {
Perfomer mouth = new Leilei(new Mouth());
mouth.perform();
Perfomer guitar = new Leilei(new Guitar());
guitar.perform();
}
}
结果展示:
稍作解释:
1.+表示public,-表示private,#表示protected
2.聚合关系可以用【带空心菱形的实线】来表示,菱形指向整体。(如:teacher是university的一个部分)
3.继承关系用【带空心三角箭头的实线】来表示,箭头从子类指向父类。
虚假的UML图:
真正的UML图:
跨平台视频播放器,可以在不同操作系统平台(如Windows、Mac、Linux等)上播放多种格式的视频文件,常见的视频格式包括RMVB、AVI、WMV等
优点:
分离抽象接口及其实现部分。使得抽象和实现可以沿着各自的维度来变化,也就是说抽象和实现不再在同一个继承层次结构中,而是“子类化”它们,使它们各自都具有自己的子类,以便任何组合子类,从而获得多维度组合对象。
在很多情况下,桥接模式可以取代多层继承方案,多层继承方案违背了“单一职责原则”,复用性较差,且类的个数非常多,桥接模式是比多层继承方案更好的解决方法,它极大减少了子类的个数。
多继承是指一个类可以同时从多个父类继承属性和方法。这种继承方式可以让子类同时拥有多个父类的特征,但也可能带来一些问题,比如构造函数的执行顺序和类中同名变量冲突等
桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统,符合“开闭原则”。
缺点:
1.桥接模式与策略模式的区别
1.桥接模式中不仅Implementor具有变化 ,而且Abstraction也可以发生变化,而且两者的变化是完全独立的
2.策略模式仅仅通过Abstraction与 Implementor之间的关系联系起来。而在策略模式中,并不考虑Context的变化,只有算法的可替代性。
3.策略模式的目的是封装一系列的算法,使得这些算法可以相互替换;而桥接模式的目的是分离抽象和实现部分,使得它们可以独立的变化。
2.前面的路以后再来探索吧……………………….