桥接模式(Bridge Pattern)——处理多维度变化

前言

P: 嘿,小重楼!我们这边有个简单的需求,交个你了。

me: 啥需求?我拒绝!!!

P: 呀?你小子敢拒绝老娘的需求,活腻了吧?

me: 好吧,我接。。。做啥呢?我接。。。

P: 我这边需要开发一个视频播放器。不仅要跨平台(Linux,Mac,Windows等)还要支持播放多种格式的视频文件(MPEG,RMVB,AVI,WMI等)哦。

me:这。。。这个要求有点太高了吧?还好现在开源项目多,可以解决技术问题。但是,这个该怎么设计呢???

Master: 没关系。。。我给你一个法宝,保准轻松解决设计问题。诺。。。桥接模式,拿去,随便用!

概述

桥接模式(Bridge Pattern) 将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。

如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥,故名桥接模式。

类图

这里写图片描述

Abstraction(抽象类):用于定义抽象类的接口,它一般是抽象类而不是接口,其中定义了一个Implementor(实现类接口)类型的对象并可以维护该对象,它与 Implementor 之间具有关联关系,它既可以包含抽象业务方法,也可以包含具体业务方法。

RefinedAbstraction(扩充抽象类):扩充由 Abstraction 定义的接口,通常情况下它不再是抽象类而是具体类,它实现了在 Abstraction 中声明的抽象业务方法,在 RefinedAbstraction 中可以调用在 Implementor 中定义的业务方法。

Implementor(实现类接口):定义实现类的接口,这个接口不一定要与 Abstraction 的接口完全一致,事实上这两个接口可以完全不同,一般而言,Implementor 接口仅提供基本操作,而 Abstraction 定义的接口可能会做更多更复杂的操作。Implementor 接口对这些基本操作进行了声明,而具体实现交给其子类。通过关联关系,在 Abstraction 中不仅拥有自己的方法,还可以调用到 Implementor 中定义的方法,使用关联关系来替代继承关系。

ConcreteImplementor(具体实现类):具体实现 Implementor 接口,在不同的 ConcreteImplementor 中提供基本操作的不同实现,在程序运行时,ConcreteImplementor 对象将替换其父类对象,提供给抽象类具体的业务操作方法。

设计模式的实现

实现前言部分代码
package Bridge;

/**
 * <p>ClassName      VideoFomat
 * <p>Description    视频格式抽象类
 * <p>Author         ChongLou
 * <p>Version
 * <p>Date           2017/11/27 0:17
 */
public interface VideoFomat {
    /**
     * 视频解码播放。
     */
    void decodingAndPlay();
}
package Bridge;

/**
 * <p>ClassName      SystemPlatform
 * <p>Description    系统平台抽象类
 * <p>Author         ChongLou
 * <p>Version
 * <p>Date           2017/11/27 0:15
 */
public abstract class SystemPlatform {
    VideoFomat videoFomat;


    /**
     * 视频播放
     */
     abstract void playVedio();

    public void setVideoFomat(VideoFomat videoFomat) {
        this.videoFomat = videoFomat;
    }
}
package Bridge;

/**
 * <p>ClassName      AVIFormat
 * <p>Description
 * <p>Author         ChongLou
 * <p>Version
 * <p>Date           2017/11/27 0:27
 */
public class AVIFormat implements VideoFomat {
    public void decodingAndPlay() {
        System.out.println("AVI video");
    }
}
package Bridge;

/**
 * <p>ClassName      MPEGFormat
 * <p>Description
 * <p>Author         ChongLou
 * <p>Version
 * <p>Date           2017/11/27 0:26
 */
public class MPEGFormat implements VideoFomat {
    public void decodingAndPlay() {
        System.out.println( " MPEG video" );
    }
}
package Bridge;

/**
 * <p>ClassName      WindowsPlatform
 * <p>Description
 * <p>Author         ChongLou
 * <p>Version
 * <p>Date           2017/11/27 0:21
 */
public class WindowsPlatform extends SystemPlatform {

    void playVedio() {
        System.out.print("windows play ");
        videoFomat.decodingAndPlay();
    }
}
package Bridge;

/**
 * <p>ClassName      MacPlatform
 * <p>Description
 * <p>Author         ChongLou
 * <p>Version
 * <p>Date           2017/11/27 0:37
 */
public class MacPlatform extends SystemPlatform {

    void playVedio() {
        System.out.print("mac play ");
        videoFomat.decodingAndPlay();
    }
}
package Bridge;

/**
 * <p>ClassName      Client
 * <p>Description
 * <p>Author         ChongLou
 * <p>Version
 * <p>Date           2017/11/27 0:44
 */
public class Client {
    public static void main(String[] args) {

        // 使用Mac播放AVI
        VideoFomat videoFomat1 = new AVIFormat();
        SystemPlatform systemPlatform1 = new MacPlatform();
        systemPlatform1.setVideoFomat( videoFomat1 );
        systemPlatform1.playVedio();

        // 使用windos 播放MPEG
        VideoFomat videoFomat2 = new MPEGFormat();
        SystemPlatform systemPlatform2 = new WindowsPlatform();
        systemPlatform2.setVideoFomat( videoFomat2 );
        systemPlatform2.playVedio();


    }

}
结果

这里写图片描述

总结

暂无

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值