结构型模式-04桥接模式

四、桥接模式

1. 定义

  • 将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实 现这两个可变维度的耦合度。

2. 结构

  • 抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用

  • 扩展抽象化(Refined Abstraction)角色 :是抽象化角色的子类,实现父类中的业务方法, 并通过组合关系调用实现化角色中的业务方法。

  • 实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。

  • 具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现

3. 案例

不同操作系统播放不同格式文件

  • UML
image-20210522211942014

4. 代码

  • MusicFile
//音乐文件(实现化角色)public interface MusicFile {    void format(String fileName);}
  • Mp3
//Mp3文件(具体的实现化角色)public class Mp3 implements MusicFile{    @Override    public void format(String fileName) {        System.out.println(fileName+".mp3");    }}
  • Wma
//Wma文件(具体的实现化角色)public class Wma implements MusicFile{    @Override    public void format(String fileName) {        System.out.println(fileName + ".wma");    }}
  • PhoneSystem
//抽象的手机操作系统类(抽象化角色)public abstract class   PhoneSystem {    protected MusicFile musicFile;    public PhoneSystem(MusicFile musicFile) {        this.musicFile = musicFile;    }    public abstract void play(String fileName);}
  • Android
//Android操作系统(扩展抽象化角色)public class Android extends PhoneSystem{    public Android(MusicFile musicFile) {        super(musicFile);    }    @Override    public void play(String fileName) {        musicFile.format(fileName);    }}
  • Ios
//Ios操作系统(扩展抽象化角色)
public class Ios extends PhoneSystem{
    public Ios(MusicFile musicFile) {
        super(musicFile);
    }

    @Override
    public void play(String fileName) {
        musicFile.format(fileName);
    }
}
  • 测试类
public class Client {
    public static void main(String[] args) {
        MusicFile rmvb = new Wma();
        PhoneSystem ps = new Ios(rmvb);
        ps.play("Tom&Jerry");
        ps = new Android(new Mp3());
        ps.play("Tom&Jerry");
    }
}
//运行结果
//Tom&Jerry.rmvb
//Tom&Jerry.mp4

5. 好处

  • 提高系统可扩充性,若添加一个文件类型,定义一个类实现接口即可
  • 实现细节对客户透明

6. 使用场景

  • 一个类存在两个独立变化的维度,且两维度都需要进行扩展
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值