手机操作问题
现对不同手机类型(折叠式、直立式、旋转式)的不同品牌(华为、小米、苹果)实现操作编程(开机、关机、上网、打电话等)
传统方式解决手机操作问题分析
- 如果再增加一个手机的样式,就需要增加各个品牌手机的类,如果增加一个手机品牌也需要在每个手机样式增加该品牌,扩展性差,且容易发生类爆炸问题
- 违反了单一职责原则,多个类维护了一个职责,当增加手机样式时,要同时增加所有品牌的手机,这样增加了代码维护成本
桥接模式
基本介绍
- 桥接模式是指,将实现与抽象放在两个不同的类层次中,是两个层次可以独立改变
- 桥接模式是一种结构性模式
- 桥接模式基于类的最小设计原则,通过使用封装、聚合以及继承等行为让不同的类承担不同的职责,它的主要特点是把抽象与行为实现分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展
桥接模式解决手机操作问题
在桥接模式下,如果需要新增一个品牌或者新增一个类别,直接增加相应的类即可,因为品牌和类别的类之间没有直接的耦合关系,类别依赖品牌的抽象
/***
* @author shaofan
* @Description
*/
public class Bridge {
public static void main(String[] args) {
Phone xiaomiFoldPhone = new FoldedPhone(new XiaoMi());
Phone xiaomiUpRightPhone = new UpRightPhone(new XiaoMi());
Phone huaweiFoldPhone = new FoldedPhone(new HuaWei());
Phone huaweiUpRightPhone = new UpRightPhone(new HuaWei());
xiaomiFoldPhone.call();
xiaomiUpRightPhone.call();
huaweiFoldPhone.call();
huaweiUpRightPhone.call();
}
}
/***
* 抽象持有一个手机的具体实现,然后向外提供功能接口,内部调用具体实现的接口
*/
abstract class Phone{
private Brand brand;
public Phone(Brand brand){
this.brand = brand;
}
protected void call(){
brand.call();
}
}
class FoldedPhone extends Phone{
public FoldedPhone(Brand brand) {
super(brand);
}
@Override
public void call(){
System.out.println("foledPhone");
super.call();
}
}
class UpRightPhone extends Phone{
public UpRightPhone(Brand brand) {
super(brand);
}
@Override
public void call(){
System.out.println("upRightPhone");
super.call();
}
}
interface Brand{
void call();
}
class XiaoMi implements Brand{
@Override
public void call() {
System.out.println("xiaomi call");
}
}
class HuaWei implements Brand{
@Override
public void call() {
System.out.println("huawei call");
}
}
源码分析
java.sql.Connection即实现,DriverManager即抽象,而Mysql和Oracle等提供实现和抽象的子类实现,在扩展的时候,仅需要在两个父类上增加新的对应的子类即可
总结
- 桥接模式实现了抽象和实现的分离,从而极大的提高了系统的灵活性,让抽象部分和实习那部分独立开,有助于系统进行分层设计,产生更好的结构化系统
- 对于系统的高层部分,只需要知道抽象部分和实现部分的接口即可,其他部分由具体业务来完成,被封装起来
- 桥接模式替代多层继承方案,可以减少子类的个数,降低系统维护成本
- 桥接模式的引入增加了系统的理解和设计的难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程
- 桥接模式要求正确识别系统中两个独立变化的维度,因此其使用范围有一定的局限性
桥接模式应用场景
- 对于不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用
- 常见的应用场景:
- JDBC驱动
- 银行转账系统(转账分类:网上转账,柜台转账,ATM转账;用户分类:普通、金卡、银卡)
- 消息管理(消息类型:即时消息、延时消息;消息载体:手机短信、邮件消息、qq消息)