桥接模式--让路更好走(结构型模式01)

什么是桥接模式?
将抽象部分与实现部分分离,使得各自变化独立自主。
现实中我们常见的桥主要作用是连接两地,这个两地就是抽象和实现两个地方,通过桥接把他们连接起来,而各自的发展不受影响。

桥接模式适用场景
想使你的代码更加灵活,易于扩展;
一个类存在两个以上的独立变化,而且这些变化需要自行扩展。

桥接模式中的角色

  1. Abstraction(抽象部分)
  2. Refined Abstraction(抽象的具体类)
  3. Implementor(实现部分)
  4. ConcreteImplementor(实现的具体类)
  5. Client(客户端)

结合例子来理解吧,我们去楼下麦克风买红茶,规格有大杯、中杯,需求样式有加冰和不加冰两种。
类图如下:
这里写图片描述

Abstraction(抽象部分):Cup类

public abstract class Cup{
    Style style;
    public Cup(Style mStyle){
        style = mStyle;
    }
    abstract void makeTea();
}

Refined Abstraction(抽象的具体类):LargeCup类和MiddleCup类

//LargeCup
public class LargeCup extends Cup{
    public LargeCup(Style style){
        super(style);
    }
    public void makeTea(){
        System.out.println("我是大杯"+style+"的红茶");
    }
}
//MiddleCup
public class MiddleCup extends Cup{
    public MiddleCup(Style style){
        super(style);
    }
    public void makeTea(){
        System.out.println("我是中杯"+style+"的红茶");
    }
}

Implementor(实现部分):Style类

public abstract class Style{
    abstract void addSth();
}

ConcreteImplementor(实现的具体类):IceStyle类和NothingStyle类

//加冰
public class IceStyle extends Style{
    void addSth(){
        System.out.println("加冰");
    }
}
//不加冰,常温
public class NothingStyle extends Style{
    void addSth(){
        System.out.println("常温");
    }
}

Client客户端调用:

public class Test{
    public static void main(String[] args){
    //大杯加冰
        Cup cup = new LargeCup(new IceStyle());
        cup.makeTea();
    }
}

输出结果:

我是大杯加冰红茶

总结:

优点:
适配器模式和桥接模式有些相似都是中间人,不过适配器模式旨在改变目标,来适配自己。而桥接模式没有要改变谁,而是更得心应手的让类的扩展性更高,比如现在,我想加入一个小杯的规格,只需要实现Cup的SmallCup类即可,加冰不加冰对于他来说是独立的,无影响的。这样整个系统耦合更低,扩展容易。

缺点:不太容易设计,对于初学者来说把握好抽象和实现的分离是一个问题?什么时候?怎么分离?对开发来说要有一定经验要求。

注意
定义里所讲将抽象与实现分离,说的并不是同一个类的抽象以及其子类的实现,而是对两个甚至多个不同类而言的,比如例子中的抽象部分可能是Cup类,实现部分可能是Style类,但并不是那么绝对的。抽象与实现对应的是两个独立变化的对象,重点在于理解独立变化的对象上,而并不在抽象和实现的定义上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值