设计模式之桥接模式java实现

来源:互联网 发布:mysql从删库到跑路 编辑:程序博客网 时间:2024/05/22 04:32

1.意图

将抽象部分和与它的实现部分分离,使它们都可以独立地变化。

2.别名

Handle/Body

3.动机

当一个抽象可能有多个实现的时,通常用继承来协调它们。抽象类定义对该抽象的接口而具体的子类则用不同的方式加以实现。但是此方法有时不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地修改,扩充和重用。


简明的说如上图:

桥接模式就是要实现A1可以通过桥调用B1也可以调用B2,A2可以通过桥调用B1,也可以调用B2

由于有了这座桥,使得桥两边的随着两端不同的维度进行变化,同时两端的事物又通过桥存在着一定的联系。


类图:


代码示例:

//电脑public abstract class Computer {    protected String computerName;    protected Phone phone;    protected Computer(Phone phone, String computerName){        this.phone=phone;        this.computerName=computerName;    }    public abstract void connect();}
//手机public interface Phone {     void connectImpl();}
//华硕品牌的电脑public class ASUSComputer extends Computer {    public ASUSComputer(Phone phone, String computerName){        super(phone,computerName);    }    @Override    public void connect() {        System.out.print(computerName);        phone.connectImpl();    }}
//戴尔品牌的电脑public class DellComputer extends Computer {    public DellComputer(Phone phone,String computerName){        super(phone,computerName);    }    @Override    public void connect() {        System.out.print(computerName);        phone.connectImpl();    }}
//三星品牌的手机public class SamsungPhone implements Phone {    @Override    public void connectImpl() {        System.out.println("连接了三星手机");    }}
//小米品牌的手机public class XiaomiPhone implements Phone {    @Override    public void connectImpl() {        System.out.println("连接了小米手机");    }}
//public abstract class Person {    protected String personName;    protected Computer computer;    protected Person(Computer computer,String personName){        this.computer=computer;        this.personName=personName;    }    public abstract void useComputer();}
//学生public class Student extends Person {    public Student(Computer computer,String personName){        super(computer,personName);    }    @Override    public void useComputer() {        System.out.print(this.personName+"使用");        computer.connect();    }}
//教师public class Teacher extends Person {    public Teacher(Computer computer,String personName){        super(computer,personName);    }    @Override    public void useComputer() {        System.out.print(personName+"使用");        computer.connect();    }}
//测试

public class BridgePatternDemo {    public static void main(String[] args) {        //华硕电脑连接上了小米手机        Computer asusComputer=new ASUSComputer(new XiaomiPhone(),"华硕A1");        asusComputer.connect();        //戴尔电脑连接上了三星手机        Computer dellComputer=new DellComputer(new SamsungPhone(),"戴尔A1");        dellComputer.connect();        //学生使用华硕电脑连接上了小米手机        Person student=new Student(new ASUSComputer(new XiaomiPhone(),"华硕A1"),"学生1");        student.useComputer();        //教师使用戴尔电脑连接上了三星手机        Person teacher=new Teacher(new DellComputer(new SamsungPhone(),"戴尔A1"),"教师1");        teacher.useComputer();    }}
输出结果:

华硕A1连接了小米手机
戴尔A1连接了三星手机
学生1使用华硕A1连接了小米手机
教师1使用戴尔A1连接了三星手机

4.适用性

1.不希望在抽象和它的实现部分之间有一个固定的绑定关系。列如在程序运行时刻实现部分应可以被选择或者切换。

2.类的抽象以及它的实现都应该可以通过生成子类方法加以扩充。这时的桥接模式使你可以不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。

3.对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。

4.想对客户完全隐藏抽象的实现部分。

5.有许多类要生成,类的层次结构说明你必须得将一个对象分解成两个部分。

6.你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。

5.与其他模式的关系

桥接模式和装饰模式:

  这两个模式在一定程度上都可减少子类的数目,避免出现复杂的继承关系,但是它们解决的方法却各有不同,装饰模式吧子类中比基类多出来的部分放到单独的类里面,以适应新功能的添加,把描述新功能的类封装到基类的对象里面时,就得到了所需要的子类对象,这些描述新功能的类通过组合可以实现很多的功能组合。而桥接模式是把两个以上独立的抽象维度分离,使用聚合的方式使其关联,来达到减少子类的目的,结构上桥接模式比装饰模式要复杂。

桥接模式和适配器模式

它们的共同点是桥接和适配器都是让两个类配合工作,它们的区别是出发点不同,适配器的出发点是改变已有的两个接口,让它们相容,可以结合那些功能上相似但是接口不同的类,桥接模式的出发点是分离抽象化和实现化,是两者的接口可以不同,目的是分离。




0 0
原创粉丝点击