桥接模式属于结构型模式。java
定义:将抽象部分与他的实现部分分离,使他们均可以独立的变化。ide
面向对象设计中,咱们还有一个重要的设计原则,就是合成/聚合复用原则,即优先使用对象合成/聚合,而不是类继承。这样作的好处是有助于你保持每一个类被封装和集中。(桥接模式符合该设计原则)
测试
聚合表示一种弱的‘拥有关系’,体现的是A对象能够包含B对象,但B对象不是A对象的一部分。this
合成则是一种强的‘拥有关系’,体现了严格的部分和总体关系,部分和总体的声明周期同样。
spa
适用性:设计
你不但愿在抽象和他的实现部分之间有一个固定的绑定关系。例如这种状况多是由于,在程序运行时刻实现部分应能够被选择或者切换。指针
类的抽象以及他的实现都应该能够经过生成子类的方法加以扩充。这时bridge模式使你能够对不一样的抽象接口和实现部分进行组合,并对他们进行扩充。code
对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码没必要从新编译。对象
有许多子类要生成,这样一种类层次结构说明你必须将一个对象分红两个部分。继承
想在多个对象间共享实现,但同时要求客户并不知道这一点。
结构
Abstraction 定义抽象类的接口。维护一个纸箱Implementor类型对象的指针。
RefinedAbstraction 扩充由Abstraction定义的接口。
Implementor 定义实现类的接口,该接口不必定要与Abstraction的接口彻底一致。
1.下述代码中,人和clothing就是一种聚合关系。
2.而人和男人不是一种合成关系。男人和type是一种合成关系(不太肯定,求大神解惑)。
public class QiaojiemoshiTest3 { public static void main(String[] args) { Clothing clothing=new Trouser(); Person person=new Man(); person.setClothing(clothing); person.dress(); } } abstract class Clothing{ public abstract void personDressCloth(Person person); } abstract class Person{ private Clothing clothing; private String type; public Clothing getClothing() { return clothing; } public void setClothing(Clothing clothing) { this.clothing = clothing; } public String getType() { return type; } public void setType(String type) { this.type = type; } public abstract void dress(); } class Man extends Person{ public Man(){ setType("男人"); } @Override public void dress() { Clothing clothing=getClothing(); clothing.personDressCloth(this); } } class Women extends Person{ //.... @Override public void dress() { } } class Trouser extends Clothing{ @Override public void personDressCloth(Person person) { System.out.println(person.getType()+"穿裤子"); } } class Dress extends Clothing{ @Override public void personDressCloth(Person person) { System.out.println(person.getType()+"穿裙子"); } }