一天一种设计模式之十三-----桥接模式

一.桥接模式简介

  1. 桥接模式属于结构型模式。java

  2. 定义:将抽象部分与他的实现部分分离,使他们均可以独立的变化。ide

  3. 面向对象设计中,咱们还有一个重要的设计原则,就是合成/聚合复用原则,即优先使用对象合成/聚合,而不是类继承。这样作的好处是有助于你保持每一个类被封装和集中。(桥接模式符合该设计原则)
    测试

    1. 聚合表示一种弱的‘拥有关系’,体现的是A对象能够包含B对象,但B对象不是A对象的一部分。this

    2. 合成则是一种强的‘拥有关系’,体现了严格的部分和总体关系,部分和总体的声明周期同样。
      spa

  4. 适用性:设计

    1. 你不但愿在抽象和他的实现部分之间有一个固定的绑定关系。例如这种状况多是由于,在程序运行时刻实现部分应能够被选择或者切换。指针

    2. 类的抽象以及他的实现都应该能够经过生成子类的方法加以扩充。这时bridge模式使你能够对不一样的抽象接口和实现部分进行组合,并对他们进行扩充。code

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

    4. 有许多子类要生成,这样一种类层次结构说明你必须将一个对象分红两个部分。继承

    5. 想在多个对象间共享实现,但同时要求客户并不知道这一点。

  5. 结构

    1. Abstraction  定义抽象类的接口。维护一个纸箱Implementor类型对象的指针。

    2. RefinedAbstraction 扩充由Abstraction定义的接口。

    3. 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()+"穿裙子");
    }
    
}
相关文章
相关标签/搜索