笨蛋学设计模式结构型模式-桥接模式【11】

这篇具有很好参考价值的文章主要介绍了笨蛋学设计模式结构型模式-桥接模式【11】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

7.5桥接模式

7.5.1概念

​ 桥接模式主要将抽象部分与实现部分分离开来,使得它们可以相互独立地变化。抽象部分定义了一个抽象类或接口,包含一些基本操作以及包含一个指向实现部分的引用。实现部分也是一个抽象类或接口,定义了一些具体的操作。

7.5.2场景

​ 比如在路上随处可见的汽车,汽车和引擎之间可以使用桥接模式。抽象部分可以是一个汽车的抽象类,实现部分可以是不同类型的汽车,如轿车、SUV等。而引擎可以是抽象部分的扩展类,实现部分可以是不同的引擎类型,如电动、燃油、混油引擎等。而我们可以创建多个引擎和汽车,而每个引擎和汽车之间都是独立的,通过桥接模式将不同类型的汽车和引擎进行组合,实现灵活的汽车配置。

7.5.3优势 / 劣势

  • 易维护:分离抽象和实现部分,使得系统更容易扩展和维护
  • 可复用性:提高系统的可复用性,使得在不同的系统中重用抽象 / 实现部分

  • 应用场景有限:主要适用于两个独立变化的维度,且维度之间都需要进行扩展
  • 增加理解难度:要求开发者针对抽象层进行编程,增加了理解和设计难度

7.5.4桥接模式可分为

  • 抽象Abstraction:一般是抽象类,定义抽象部分的接口,维护一个对实现的引用
  • 修正抽象RefinedAbstraction:对抽象接口进行扩展,通常对抽象化的不同维度进行变化或定制
  • 实现Implementor:定义实现部分的接口,提供具体的实现。该接口通常是抽象化接口的实现
  • 具体实现ConcreteImplementor:实现实现化接口的具体类,由这些类负责实现实现化接口定义的具体操作

7.5.5外观模式

package com.technologystatck.designpattern.mode.bridging;

public class Bridging {
    public static void main(String[] args) {

        //创建具体实现化对象
        Implementor implementationA = new ConcreteImplementationA();
        Implementor implementationB = new ConcreteImplementationB();

        //使用扩充抽象化对象,将实现化对象传递进去
        Abstraction abstractionA = new RefinedAbstraction(implementationA);
        Abstraction abstractionB = new RefinedAbstraction(implementationB);

        //调用抽象化的操作
        abstractionA.operation();
        abstractionB.operation();

        System.out.println("--------------------------------------------");

        ATV atv = new ATV();
        BTV btv = new BTV();

        RemoteControl basicRemoteForA = new BasicRemoteControl(atv);
        RemoteControl basicRemoteForB = new BasicRemoteControl(btv);

        basicRemoteForA.turnOn();
        basicRemoteForA.turnOff();
        basicRemoteForA.tuneChannel();

        basicRemoteForB.turnOn();
        basicRemoteForB.turnOff();
        basicRemoteForB.tuneChannel();
    }
}

//创建实现接口
interface Implementor{
    void operationImpl();
}

//用电视举例,电视具有开关和切换频道的功能
interface TV{
    void on();
    void off();
    void tuneChannel();
}
//创建具体实现类:实际提供服务的对象
class ConcreteImplementationA implements Implementor{

    @Override
    public void operationImpl() {
        //具体实现A
        System.out.println("具体实现A");
    }
}

class ConcreteImplementationB implements Implementor{
    @Override
    public void operationImpl() {
        //具体实现B
        System.out.println("具体实现B");
    }
}

//用电视举例,创建具体实现类
class ATV implements TV{

    @Override
    public void on() {
        System.out.println("A TV is ON");
    }

    @Override
    public void off() {
        System.out.println("A TV is OFF");
    }

    @Override
    public void tuneChannel() {
        System.out.println("Turning A TV channel");
    }
}
class BTV implements TV{

    @Override
    public void on() {
        System.out.println("B TV is ON");
    }

    @Override
    public void off() {
        System.out.println("B TV is OFF");
    }

    @Override
    public void tuneChannel() {
        System.out.println("Turning B TV channel");
    }
}

//创建抽象类:包含一个对实现化接口的引用
abstract class Abstraction {
    protected Implementor implementor;

    public Abstraction(Implementor implementor) {
        this.implementor = implementor;
    }

    public void operation() {
        this.implementor.operationImpl();
    }
}
//用电视举例
abstract class RemoteControl{
    //持有一个实现化接口的引用
    protected TV tv;
    public RemoteControl(TV tv) {
        this.tv=tv;
    }

    abstract void turnOn();
    abstract void turnOff();
    abstract void tuneChannel();
}

//实现抽象类,创建RefinedAbstraction类
class RefinedAbstraction extends Abstraction {
    private Implementor implementor;


    public RefinedAbstraction(Implementor implementor) {
        super(implementor);
        this.implementor=implementor;
    }
    @Override
    public void operation() {
        this.implementor.operationImpl();
    }
}

class BasicRemoteControl extends RemoteControl{

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

    @Override
    void turnOn() {
        tv.on();
    }

    @Override
    void turnOff() {
        tv.off();
    }

    @Override
    void tuneChannel() {
        tv.tuneChannel();
    }
}

7.5.6实战

7.5.6.1题目描述

小明家有一个万能遥控器,能够支持多个品牌的电视。每个电视可以执行开机、关机和切换频道的操作,请你使用桥接模式模拟这个操作。

7.5.6.2输入描述

第一行是一个整数 N(1 <= N <= 100),表示后面有 N 行输入。

接下来的 N 行,每行包含两个数字。第一个数字表示创建某个品牌的遥控和电视,第二个数字表示执行的操作。

其中,0 表示创建 Sony 品牌的电视,1 表示创建 TCL 品牌的遥控和电视;

2 表示开启电视、3表示关闭电视,4表示切换频道。

7.5.6.3输出描述

对于每个操作,输出相应的执行结果。

7.5.6.4实战
package com.technologystatck.designpattern.mode.bridging;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int nums = scanner.nextInt();
        scanner.nextLine();


        for(int i=0;i<nums;i++) {
            String[] input = scanner.nextLine().split(" ");
            int brand = Integer.parseInt(input[0]);
            int operation = Integer.parseInt(input[1]);

            //根据输入的不同,执行对应的操作
            UniversalRemoteTV universalRemoteTV= null;
            if(brand==0) {
                universalRemoteTV = new SonyTV();
            }else if(brand ==1) {
                universalRemoteTV = new TCLTV();

            }
            AbstractionTV abstractionTV=null;
            if(operation==2) {
                abstractionTV = new PowerOperation(universalRemoteTV);
            }else if(operation ==3) {
                abstractionTV = new OffOperation(universalRemoteTV);
            }else if (operation ==4) {
                abstractionTV = new ChannelOperation(universalRemoteTV);
            }

            abstractionTV.performOperation();

        }
    }
}

//定义实现接口
interface UniversalRemoteTV{
    //定义远程遥控电视的三个功能
    void onTV();
    void offTV();
    void channelTV();
}

//创建两个品牌电视具体实现类
class SonyTV implements UniversalRemoteTV{

    @Override
    public void onTV() {
        System.out.println("Sony TV is ON");
    }

    @Override
    public void offTV() {
        System.out.println("Sony TV is OFF");
    }

    @Override
    public void channelTV() {
        System.out.println("Switching Sony TV channel");
    }
}

class TCLTV implements UniversalRemoteTV{

    @Override
    public void onTV() {
        System.out.println("TCL TV is ON");
    }

    @Override
    public void offTV() {
        System.out.println("TCL TV is OFF");
    }

    @Override
    public void channelTV() {
        System.out.println("Switching TCL TV channel");
    }
}

//创建抽象类,对一个实现的引用
abstract class AbstractionTV{
    protected UniversalRemoteTV universalRemoteTV;

    public AbstractionTV(UniversalRemoteTV universalRemoteTV){
        this.universalRemoteTV = universalRemoteTV;
    }

    abstract void performOperation();

}

//创建扩充抽象化类
//打开电视操作
class PowerOperation extends AbstractionTV {


    public PowerOperation(UniversalRemoteTV universalRemoteTV) {
        super(universalRemoteTV);
    }

    @Override
    void performOperation() {
        universalRemoteTV.onTV();
    }
}
//关闭电视操作
class OffOperation extends AbstractionTV {

    public OffOperation(UniversalRemoteTV universalRemoteTV) {
        super(universalRemoteTV);
    }

    @Override
    void performOperation() {
        universalRemoteTV.offTV();
    }
}
//切换频道操作
class ChannelOperation extends AbstractionTV {

    public ChannelOperation(UniversalRemoteTV universalRemoteTV) {
        super(universalRemoteTV);
    }

    @Override
    void performOperation() {
        universalRemoteTV.channelTV();
    }
}

7.5.7总结

  • 桥接模式

  • 优点:方便将抽象部分和实现部分独立扩展,不需要修改另一个部分,减少系统的耦合度

  • 总结:将系统的功能分为抽象部分和实现部分,两个部分独立存在

  • 场景文章来源地址https://www.toymoban.com/news/detail-797079.html

    • 不希望使用继承,或者继承导致类爆炸性增长
    • 当一个类具有多个独立变化的维度时

到了这里,关于笨蛋学设计模式结构型模式-桥接模式【11】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 笨蛋学设计模式结构型模式-适配器模式【7】

    7.1.1概念 ​ 适配器模式是指将一个类的接口转换成客户端所期望的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类,能够在一起工作。基本上也就是通过增加一个中间层来解决,而适配器扮演的角色恰恰就是这个中间层。 7.1.2场景 ​ 在我们生活中可以看见的

    2024年01月18日
    浏览(28)
  • 结构型设计模式——桥接模式

    桥接模式(Bridge pattern): 使用桥接模式通过将实现和抽象放在两个不同的类层次中而使它们可以独立改变。 桥接模式 (Bridge) 是一种结构型设计模式, 可将 抽象 部分与 实现 部分 分离 ,使它们都可以独立的变化。如果一个系统需要在构件的抽象化角色和具体化角色之间增加更

    2024年02月07日
    浏览(43)
  • 设计模式-结构型模式之桥接模式

    设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案: 第一种设计方案是为每一种形状都提供一套各种颜色的版本。 第二种设计方案是根据实际需要对形状和

    2023年04月18日
    浏览(30)
  • 设计模式之桥接模式【结构型模式】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博

    2024年01月25日
    浏览(40)
  • 设计模式—结构型模式之桥接模式

    将抽象与实现解耦,使两者都可以独立变化。 在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 Photoshop 这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但

    2024年02月05日
    浏览(39)
  • 【结构型设计模式】C#设计模式之桥接模式

    题目:设计一个桥接模式来实现图形和颜色之间的解耦。 解析: 桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立变化。在这个例子中,抽象部分是图形(如圆形、正方形),实现部分是颜色(如红色、蓝色)。 我们可以使用桥接模式来解耦

    2024年02月13日
    浏览(34)
  • 【Java 设计模式】结构型之桥接模式

    桥接模式(Bridge Pattern)是一种结构型设计模式, 它将抽象部分与实现部分分离,使它们可以独立变化,从而降低它们之间的耦合 。桥接模式通过将抽象部分和实现部分分离,使得它们可以独立地变化,同时在它们之间建立一个桥梁。在本文中,我们将介绍 Java 中桥接模式的

    2024年01月19日
    浏览(38)
  • c#设计模式-结构型模式 之 桥接模式

            桥接模式是一种设计模式,它将抽象与实现分离,使它们可以独立变化。这种模式涉及到一个接口作为桥梁,使实体类的功能独立于接口实现类。这两种类型的类可以结构化改变而互不影响。         桥接模式的主要目的是通过将实现和抽象分离,使两者可以

    2024年02月12日
    浏览(35)
  • 《golang设计模式》第二部分·结构型模式-02-桥接模式(Bridge)

    桥(Bridge)使用组合关系将代码的实现层和抽象层分离,让实现层与抽象层代码可以分别自由变化。 例如 客户端调用桥接接口实现原有功能和扩展功能的组合 Implementor(实施者): 具体实施者的抽象,可以是一个接口。 Concrete Implementor(具体实施者): 可以理解为扩展之前

    2024年02月12日
    浏览(32)
  • Java设计模式之结构型-桥接模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、支付方式 4.2、支付渠道  五、总结 桥接模式(Bridge Pattern)是一种结构型设计模式,其主要目的是“将抽象部分与实现部分分离,使它们都可以独立地变化”。 桥接模式的核心思想是把抽象(abstraction)与实现

    2024年02月13日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包