小言_互联网的博客

设计模式 桥接模式

372人阅读  评论(0)

定义

将抽象部分与它的具体 实现部分分离,使它们都可以独立地变化(解耦)
通过组合的方式建立两个类之间关系,而不是继承
桥接模式一般是涉及2个对象(2个方面),一个是抽象对象,一个是具体的实现,涉及到2个维度的变化。

类型:结构型

使用场景

抽象和具体实现之间增加更多的灵活性
一类存在两个或多个独立变化的唯独,且这两个(或多个)维度都需要独立进行扩展
不希望使用继承,或因为多层继承导致系统类的个数剧增

优缺点

优点:
分离抽象部分及具体实现部分
提高系统可扩展性
符合开闭原则
符合合成复用原则

缺点:
增加了系统的理解与设计难度
需要正确地识别出系统中两个独立的

桥接模式与其他模式

桥接模式和组合模式:

组合模式强调的是整体与部分的组合
桥接模式更强调平行部分的组合

桥接模式和适配器模式

共同点:为了让2个东西配合工作
适配器模式是改变已有的接口,来实现配合
桥接模式是分离抽象与具体,目的是分离

补充:聚合与合成

聚合表示一种弱的“持有关系”,体现的是A对象可以包含B对象,但B对象不是A对象的一部分,合成则是一种强的“持有”关系,体现了严格的部分与整体的关系,部分和整体的生命周期一样,比如大雁有两个翅膀,翅膀与大雁是部分与整体的关系,并且它们生命周期相同,这样翅膀与大雁就是合成关系,而大雁是群居动物,一个大雁群可以有多只大雁,这就是聚合关系。

实例

以咖啡为例子
咖啡抽象类

public abstract class Coffee {
    CoffeeAdditives coffeeAdditives;

    public Coffee(CoffeeAdditives coffeeAdditives) {
        this.coffeeAdditives = coffeeAdditives;
    }

   abstract void makeCoffee();
}

咖啡的实现接口类

public interface CoffeeAdditives {
    String makeCoffee();
}

咖啡维度的变化:

public class LargeCoffee extends Coffee {

    public LargeCoffee(CoffeeAdditives coffeeAdditives) {
        super(coffeeAdditives);
    }

    @Override
    void makeCoffee() {
       System.out.println("大杯"+coffeeAdditives.makeCoffee());
    }
}

public class SmallCoffee extends Coffee {

    public SmallCoffee(CoffeeAdditives coffeeAdditives) {
        super(coffeeAdditives);
    }

    @Override
    void makeCoffee() {
        System.out.println("小杯" + coffeeAdditives.makeCoffee());
    }
}

咖啡实现类的具体实现上的变化

public class Suggar implements  CoffeeAdditives {
    @Override
    public String makeCoffee() {
        return "加糖";
    }
}
public class Ordinary implements CoffeeAdditives {
    @Override
    public String makeCoffee() {
        return "原味";
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        LargeCoffee largeCoffee=new LargeCoffee(new Suggar());
        largeCoffee.makeCoffee();

        SmallCoffee smallCoffee=new SmallCoffee(new Ordinary());
        smallCoffee.makeCoffee();

        LargeCoffee largeCoffee1=new LargeCoffee(new Ordinary());
        largeCoffee1.makeCoffee();
    }
}

转载:https://blog.csdn.net/danfengw/article/details/95597538
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场