设计模式的代码:https://github.com/Aerozb/design_patterns
参考一小点:https://www.cnblogs.com/WindSun/p/10260547.html
图一
图二
有这么一个问题,一个手机分不同品牌,不同类型,如果有很多个我们该怎么实现,会方便拓展,如果使用图一方式拓展类会爆炸,而图二方式如果要新增一个类比如全屏手机类,只需要继承Phone即可,剩下的调用方式不变,多一个品牌也是如此实现Brand接口就行
1.品牌接口及功能
public interface Brand {
public void open();
public void close();
public void callAll();
}
2.具体品牌和具体功能
public class XiaoMi implements Brand {
@Override
public void open() {
System.out.println("打开小米手机");
}
@Override
public void close() {
System.out.println("关闭小米手机");
}
@Override
public void callAll() {
System.out.println("小米手机打给所有人");
}
}
3.抽象类充当桥接类,把品牌接口聚合进来,然后构造器里赋值,以后要用到具体哪个品牌传进来就行(是在具体手机类传,就是new具体手机类),抽象方法跟品牌类的功能一样
public abstract class Phone {
protected Brand brand;
public Phone(Brand brand) {
this.brand = brand;
}
public abstract void open();
public abstract void close();
public abstract void callAll();
}
4.折叠手机类,通过构造器选择哪个具体的品牌
public class FoldingPhone extends Phone {
public FoldingPhone(Brand brand) {
//调用的是父类的构造器,就是给brand赋值
super(brand);
}
@Override
public void open() {
//实际是调用品牌类的功能
brand.open();
System.out.println("折叠手机");
}
@Override
public void close() {
brand.close();
System.out.println("折叠手机");
}
@Override
public void callAll() {
brand.callAll();
System.out.println("折叠手机");
}
}
5.用户使用,通过构造器参数选择使用哪个品牌
构造的时候是具体构造器,不是抽象的,然后赋值给抽象类,这样才能明白是使用哪个具体类,因为都是继承Phone类,所以如果要变换的话,new 后面的改成其他类就行,方法不用改
public class Client {
public static void main(String[] args) {
Phone phone1=new FoldingPhone(new XiaoMi());
phone1.open();
phone1.close();
phone1.callAll();
}
}
结果:
打开小米手机
折叠手机
关闭小米手机
折叠手机
小米手机打给所有人
折叠手机
6.如果要增加一个类型的手机继承Phone抽象类就行,方便拓展
public class FullScreenPhone extends Phone {
public FullScreenPhone(Brand brand) {
super(brand);
}
@Override
public void open() {
brand.open();
System.out.println("全屏手机");
}
@Override
public void close() {
brand.close();
System.out.println("全屏手机");
}
@Override
public void callAll() {
brand.callAll();
System.out.println("全屏手机");
}
}
适用场景:
适用一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
小结:
相当于把两个维度的类解耦,不像图一,关联在一起,增加一个手机类型,类型下面又得添加手机品牌,每次都这样累死
所以把这两个类单独脱离出来,这样手机类型增加品牌类也就不用增加,我要新增一个类型,只需继承一个类就行,要使用哪个品牌,通过聚合在抽象类里就行,然后使用时在带参构造器里传入具体品牌类就行。
最后再来看下使用桥接模式的JDBC类图