一、基本概念
桥接模式:
将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
为什么不直接使用继承呢?不是可以通过继承来实现多态吗?为什么用组合方式?
二、使用场景
对于只有一个维度的变化,使用继承来实现多态的功能,完全可以满足。
但对于存在多个维度
的使用场景,完全使用继承就会显得代码比较臃肿。
像上面这种情况,如果使用继承实现的话,需要4 * 3一共12种子类。如果需要新增加一个品牌Oppo的话,需要增加4个子类,代码实现的繁琐程度随着品类的个数成正比。
桥接模式解决了多层继承的结构,处理多维度变化
的场景,将各个维度设计成独立的继承结构。使各个维度可以独立的扩展在抽象层建立联系。
三、应用实例
我们使用桥接模式来实现不同的颜色和品牌组合的手机产品。
Brand品牌类实现:
public interface Brand {
String getBrand();
}
class HuaWei implements Brand {
@Override
public String getBrand(){
return "HuaWei手机";
}
}
class XiaoMi implements Brand {
@Override
public String getBrand(){
return "XiaoMi手机";
}
}
class Apple implements Brand {
@Override
public String getBrand(){
return "Apple手机";
}
}
Color颜色类实现:
public class Color{
Brand brand;
String name;
public Color(Brand brand) {
this.brand = brand;
}
public String getBrand() {
return brand.getBrand();
}
public String getName() {
return name;
}
}
class Blue extends Color{
public Blue(Brand brand) {
super(brand);
}
@Override
public String getName() {
return "blue 颜色";
}
}
class Red extends Color{
public Red(Brand brand) {
super(brand);
}
@Override
public String getName() {
return "red 颜色";
}
}
class Yellow extends Color{
public Yellow(Brand brand) {
super(brand);
}
@Override
public String getName() {
return "yellow 颜色";
}
}
class White extends Color{
public White(Brand brand) {
super(brand);
}
@Override
public String getName() {
return "white 颜色";
}
}
main函数实现:
public static void main(String[] args) {
Color blueHuawei = new Blue(new HuaWei());
System.out.println(blueHuawei.getName() + "__" + blueHuawei.getBrand());
Color redXiaomi = new Red(new XiaoMi());
System.out.println(redXiaomi.getName() + "__" + redXiaomi.getBrand());
Color WhiteApple = new White(new Apple());
System.out.println(WhiteApple.getName() + "__" + WhiteApple.getBrand());
}
运行结果如下:
这样,就可以通过不同的颜色(4个子类)和品牌(3个子类)进行组合,得到自己想要的类的实例,一种只需要实现4 + 3一共7个子类即可。在某一个维度进行拓展时(新增一个品牌或颜色),只需要新增一个对应的子类就可以。
四、拓展思考
此时再增加一个维度,如型号(曲面屏、全面屏、折叠屏),该如何实现?
实现起来也非常方便,可以参考Brand品牌类的实现即可。
参考链接:
http://c.biancheng.net/view/1364.html
https://www.runoob.com/design-pattern/filter-pattern.html
https://www.cnblogs.com/meet/p/5116458.html