背景
我们在日常生活中会遇到这样的场景:去西餐厅点牛排时,服务员会问你要眼肉、西冷还是菲力(部位),然后有时还会问其他维度的:要日本和牛、澳洲和牛还是澳洲安格斯牛。。。在软件开发中,我们也会碰到这种场景:类的变化维度有多个,如果用继承的方法去实现,会有类爆炸的问题,这时桥接模式就是来解决这类问题。
角色
实现化角色:是一接口,代表某一种维度
具体实现化角色:实现化角色的具体实现,该维度有几种变化,就有几个具体实现化类
抽象化角色:是一抽象化类,并有一实现化角色类型的属性,通常由构造函数传入-赋值,代表另一种维度
具体抽象化角色:抽象化角色的具体实现,该维度有几种变化就对应有几个具体的具体抽象化角色
代码实现
/**
* 实现化角色:牛种维度
*/
public interface CattleBreed {
String BreedingGround();
}
/**
* 具体实现化角色:日本和牛
*/
public class RibenHeNiu implements CattleBreed {
@Override
public String BreedingGround() {
return "日本和牛";
}
}
/**
* 具体实现化角色:澳洲和牛
*/
public class AozhouHeNiu implements CattleBreed {
@Override
public String BreedingGround() {
return "澳洲和牛";
}
}
/**
* 具体实现化角色:澳洲安格斯牛
*/
public class AozhouAgsNiu implements CattleBreed {
@Override
public String BreedingGround() {
return "澳洲安格斯牛";
}
}
/**
* 抽象化角色:牛的部位
*/
public abstract class CattlePart {
protected CattleBreed breed;
public CattlePart(CattleBreed breed) {
this.breed = breed;
}
public abstract void order();
}
/**
* 具体抽象化角色:眼肉
*/
public class YanRou extends CattlePart {
public YanRou(CattleBreed breed) {
super(breed);
}
@Override
public void order() {
String s = this.breed.BreedingGround() + ":眼肉";
System.out.println(s);
}
}
/**
* 具体抽象化角色:西冷
*/
public class XiLeng extends CattlePart {
public XiLeng(CattleBreed breed) {
super(breed);
}
@Override
public void order() {
String s = this.breed.BreedingGround() + ":西冷";
System.out.println(s);
}
}
/**
* 具体抽象化角色:菲力
*/
public class FeiLi extends CattlePart {
public FeiLi(CattleBreed breed) {
super(breed);
}
@Override
public void order() {
String s = this.breed.BreedingGround() + ":菲力";
System.out.println(s);
}
}
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
CattleBreed ribenHeNiu = new RibenHeNiu();
new YanRou(ribenHeNiu).order();
new XiLeng(ribenHeNiu).order();
new FeiLi(ribenHeNiu).order();
CattleBreed aozhouHeNiu = new AozhouHeNiu();
new YanRou(aozhouHeNiu).order();
new XiLeng(aozhouHeNiu).order();
new FeiLi(aozhouHeNiu).order();
}
}
运行结果如下:
优缺点
优点:
- 提高了系统的可扩展性:任一维度需要增加,都不需要修改原有系统
- 减少了类的个数:若2个变化维度,一个有x种,另一个有y种,使用继承需要x*y个子类;而用桥接模式只需要x+y个类
- 降低了系统的耦合度
缺点:
- 增加系统的理解与设计难度
- 要求开发者能识别出系统独立变化的维度,对开发者要求较高