【一天一个设计模式】—— 桥接模式 (Bridge Pattern)

定义

Decouple an abstraction from its implementation so that the two can vary independently.
将抽象和实现解耦,使得两者可以独立地变化。

通过定义可知,桥接模式的意思就是将抽象和实现通过桥梁连接,到达解耦的目的。

UML图
在这里插入图片描述
如图,左半部分即为抽象,右半部分为实现桥梁实现化角色Implementor(抽象化角色Abstraction持有实现者角色,并在功能接口中委托给它,起到搭建桥梁的作用)

一般而言,桥接模式由4部分组成

Abstraction —— 抽象化角色,它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。
Implementor —— 实现化角色,它是接口或者抽象类,定义角色必需的行为和属性。
RefinedAbstraction —— 修正抽象化角色,它引用实现化角色对抽象化角色进行修正。
ConcreteImplementor —— 具体实现化角色,它实现接口或抽象类定义的方法和属性。


下面通过JAVA全栈知识体系给出的例子具体看一下桥接模式的实现。

RemoteControl 表示遥控器,指代抽象化角色Abstraction
ConcreteRemoteControl代指修正抽象化角色RefinedAbstraction
TV 表示电视,指代实现化角色Implementor
Sony代指具体实现化角色ConcreteImplementor
桥接模式将遥控器和电视分离开来,从而可以独立改变遥控器或者电视的实现

代码

1.创建实现化角色Implementor — TV

public abstract class TV {
    public abstract void on();
    public abstract void off();
    public abstract void tuneChannel();
}

2.创建具体实现化角色ConcreteImplementor — Sony

public class Sony extends TV {
    @Override
    public void on() {
        System.out.println("Sony.on()");
    }

    @Override
    public void off() {
        System.out.println("Sony.off()");
    }

    @Override
    public void tuneChannel() {
        System.out.println("Sony.tuneChannel()");
    }
}

3.创建抽象化角色Abstraction — RemoteControl

public abstract class RemoteControl {
	//通过声明实现化角色来架设桥梁
    protected TV tv;

    public RemoteControl(TV tv) {
        this.tv = tv;
    }

    public abstract void on();
    public abstract void off();
    public abstract void tuneChannel();
}

4.创建修正抽象化角色RefinedAbstraction — ConcreteRemoteControl

/**
作为抽象化角色的子类,增加新的功能,也就是增加新的接口(方法),与其构成类的功能层次结构
*/
public class ConcreteRemoteControl extends RemoteControl{

    public ConcreteRemoteControl(TV tv) {
        super(tv);
    }

	@Override
    public void on() {
        System.out.println("ConcreteRemoteControl.on()");
        tv.on();
    }

    @Override
    public void off() {
        System.out.println("ConcreteRemoteControl.off()");
        tv.off();
    }

    @Override
    public void tuneChannel() {
        System.out.println("ConcreteRemoteControl.tuneChannel()");
        tv.tuneChannel();
    }
}

5.测试

public class Test{
    public static void main(String[] args) {
        RemoteControl remoteControl = new ConcreteRemoteControl(new Sony());
        remoteControl.on();
        remoteControl.off();
        remoteControl.tuneChannel();
    }
}
  

上述代码将抽象部分实现部分分离,使它们都可以独立的变化,桥接模式的关键是桥梁的连接,其体现在抽象化角色依赖了实现化角色,即 protected TV tv;

总结

1.使用场景:

  1. 不希望或不适用使用继承的场景
  2. 接口或抽象类不稳定的场景
  3. 重用性要求较高的场景

2.优点:

1、通过将抽象和实现的分离,使代码解耦。 2、具有优秀的扩展能力。 3、实现细节对客户透明。

3.缺点:

桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Uranus^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值