首页 > 编程语言 >Java设计模式之桥接模式

Java设计模式之桥接模式

时间:2023-10-11 14:44:40浏览次数:47  
标签:Java 角色 videoFile 桥接 fileName VideoFile 视频文件 设计模式 public

1.1.概述

现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的 方式来设计类的关系:

我们可以发现有很多的类,假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类。 试想,在一个有多种可能会变化的维度的系统中,用继承方式会造成类爆炸,扩展起来不灵活。每次在一个维度上新增一个具体实现都要增加多个子类。为了更加灵活的设计系统,我们此时可以考虑使用桥 接模式。 定义: 将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

1.2.结构

桥接(Bridge)模式包含以下主要角色: • 抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用。 •  扩展抽象化(Refined Abstraction)角色 :是抽象化角色的子类,实现父类中的业务方法, 并通过组合关系调用实现化角色中的业务方法。 • 实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。 • 具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。

1.3.案例

【例】视频播放器 需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows、Mac、Linux等)上播放多 种格式的视频文件,常见的视频格式包括RMVB、AVI、WMV等。该播放器包含了两个维度,适合使用桥接模式。 类图如下:

/**
 * @version v1.0
 * @ClassName: VideoFile
 * @Description: 视频文件(实现化角色)
 * @Author: 黑马程序员
 */
public interface VideoFile {

    //解码功能
    void decode(String fileName);
}

/**
 * @version v1.0
 * @ClassName: AviFile
 * @Description: avi视频文件(具体的实现化角色)
 * @Author: 黑马程序员
 */
public class AviFile implements VideoFile {

    public void decode(String fileName) {
        System.out.println("avi视频文件 :" + fileName);
    }
}


/**
 * @version v1.0
 * @ClassName: RmvbFile
 * @Description: rmvb视频文件(具体的实现化角色)
 * @Author: 黑马程序员
 */
public class RmvbFile implements VideoFile {

    public void decode(String fileName) {
        System.out.println("rmvb视频文件 :" + fileName);
    }
}

/**
 * @version v1.0
 * @ClassName: OpratingSystem
 * @Description: 抽象的操作系统类(抽象化角色)
 * @Author: 黑马程序员
 */
public abstract class OperatingSystem {

    //声明videFile变量
    protected VideoFile videoFile;

    public OperatingSystem(VideoFile videoFile) {
        this.videoFile = videoFile;
    }

    public abstract void play(String fileName);
}



/**
 * @version v1.0
 * @ClassName: Windows
 * @Description: 扩展抽象化角色(windows操作系统)
 * @Author: 黑马程序员
 */
public class Windows extends OperatingSystem {

    public Windows(VideoFile videoFile) {
        super(videoFile);
    }

    public void play(String fileName) {
        videoFile.decode("windows系统解码:"+fileName);
    }
}

/**
 * @version v1.0
 * @ClassName: Mac
 * @Description: Mac操作系统(扩展抽象化角色)
 * @Author: 黑马程序员
 */
public class Mac extends OperatingSystem {

    public Mac(VideoFile videoFile) {
        super(videoFile);
    }

    public void play(String fileName) {
        videoFile.decode("mac系统解码:"+fileName);
    }
}

/**
 * @version v1.0
 * @ClassName: Client
 * @Description: TODO(一句话描述该类的功能)
 * @Author: 黑马程序员
 */
public class Client {
    public static void main(String[] args) {
        //创建mac系统对象
        OperatingSystem system = new Mac(new AviFile());
        //使用操作系统播放视频文件
        system.play("战狼3");
    }
}

好处:

• 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。  如:如果现在还有一种视频文件类型wmv,我们只需要再定义一个类实现VideoFile接口即可, 其他类不需要发生变化。 • 实现细节对客户透明

1.4.使用场景

• 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。 • 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。 • 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。避免在两个层次之间 • 建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。    

 

标签:Java,角色,videoFile,桥接,fileName,VideoFile,视频文件,设计模式,public
From: https://www.cnblogs.com/carlors/p/17757040.html

相关文章

  • 日期格式转换异常:Java 8 date/time type `java.time.LocalDateTime` not supported by
    异常信息:"unexpectederror:Typedefinitionerror:[simpletype,classjava.time.LocalDateTime];nestedexceptioniscom.fasterxml.jackson.databind.exc.InvalidDefinitionException:Java8date/timetype`java.time.LocalDateTime`notsupportedbydefault:......
  • java RestTemplate集成HttpClient池化及异常重试
    解决存在网络隔离,首次连接请求被拒绝情况SocketException首次请求超时情况SocketTimeoutException无返回数据清空NoHttpResponseException进行重试importorg.apache.http.HttpEntityEnclosingRequest;importorg.apache.http.NoHttpResponseException;importorg.apache.htt......
  • kali-Java版本管理-update-alternatives
    kali-Java版本管理-update-alternativeshttps://blog.csdn.net/qq_44029310/article/details/126086895列出软件的所有版本update-alternatives--config软件名update-alternatives--configjava的示例输出Thereare3choicesforthealternativejava(providing/usr......
  • Redis的Java客户端——SpringDataRedis、RedisTemplate、StringRedisTemplate
     版权声明:本文为CSDN博主「我爱布朗熊」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_51351637/article/details/127502799一、初步了解SpringDataRedisSpringData是Spring中数据操作的模块,包括对各种数据库的集......
  • Java算法之动态规划详解
    ①动态规划动态规划(DynamicProgramming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,从而创立了动态规划。动态规划的应用极其广泛,包括工程技术、经济、工业生产、军事......
  • 解决 jmeter 压测Non HTTP response code: java.net.NoRouteToHostException/Non HTTP
    针对centos:先检查下tcp port range在合理范围内: cat /proc/sys/net/ipv4/ip_local_port_range 102465535上述为centos合理范围,不合理作出修改解决方法:1.调低端口释放后的等待时间,默认为60s,修改为15~30secho30>/proc/sys/net/ipv4/tcp_fin_timeout2.修改tc......
  • 【Java】对两个Set取交集,差集,并集
    1、取交集(取两个集合中都存在的元素)HashSet<String>setA=newHashSet<>();HashSet<String>setB=newHashSet<>();//用于存放结果HashSet<String>resSet=newHashSet<>();resSet.addAll(setA);resSet.retainAll(setB);returnresSet;2、取差集(取存......
  • struts2调用javabean中的方法
    1.<s:setname="str"value="helloworld"></s:set><s:propertyvalue="%{@com.Test@func(#str)}"/>其中func是com.Test中的一个静态方法2.<s:beanname="com.Test"id="t"><......
  • java内部类有什么好处
    内部类:一个内部类的定义是定义在另一个内部的类。原因是:1.一个内部类的对象能够访问创建它的对象的实现,包括私有数据。2.对于同一个包中的其他类来说,内部类能够隐藏起来。3.匿名内部类可以很方便的定义回调。4.使用内部类可......
  • java如何做大体积的文件上传和下载
    在Java中,实现大体积文件的上传和下载涉及到处理文件的分片、并发上传、断点续传等问题。本文将详细介绍如何通过Java实现大体积文件的上传和下载。1.文件上传文件上传是将本地文件上传到服务器的过程。对于大体积文件的上传,我们可以将文件分成多个小片段进行并发上传。1.1文件......