码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Java中23种面试常考的设计模式之桥接模式(Bridge)---结构型模式】


    【Java中23种面试常考的设计模式之桥接模式(Bridge)—结构型模式】

    知识回顾:

    之前我们讲过的设计模式在这里呦:
    【面试最常见的设计模式之单例模式】
    【面试最常见的设计模式之工厂模式】
    【Java中23种面试常考的设计模式之备忘录模式(Memento)—行为型模式】
    【Java中23种面试常考的设计模式之观察者模式(Observer)—行为型模式】
    【Java中23种面试常考的设计模式之模板模式(Template)—行为型模式】
    【Java中23种面试常考的设计模式之状态模式(State)—行为型模式】
    【Java中23种面试常考的设计模式之策略模式(Strategy)—行为型模式】
    【Java中23种面试常考的设计模式之迭代器模式(Iterator)—行为型模式】
    【Java中23种面试常考的设计模式之访问者模式(Visitor)—行为型模式】
    【Java中23种面试常考的设计模式之中介者模式(Mediator)—行为型模式】
    【Java中23种面试常考的设计模式之解释器模式(Interpreter)—行为型模式】
    【Java中23种面试常考的设计模式之命令模式(Command)—行为型模式】
    【Java中23种面试常考的设计模式之责任链模式(Chain of Responsibility)—行为型模式】
    【Java中23种面试常考的设计模式之适配器模式(Adapter)—结构型模式】
    接下来我们要进行学习的是:【Java中23种面试常考的设计模式之桥接模式(Bridge)—结构型模式】。

    桥接模式

    桥接模式: 将抽象部分与实现部分分离,使它们都可以独立的变化。

    解决的问题

    1. 对于两个独立变化的维度,使用桥接模式再适合不过了。
    2. 处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。

    生产开发中常用的使用场景

    1. 对于两个独立变化的维度,使用桥接模式再适合不过了。

    模式优点与缺点

    优点
    1. 抽象和实现的分离。 桥接模式可以取代多层继承的方案。 多层继承违背了单一职责原则,复用性较差,类的个数也非常多。桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。
    2. 优秀的扩展能力。桥接模式极大的提高了系统可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统,符合开闭原则。
    缺点
    1. 桥接模式的引入会增加系统的理解与设计难度。

    核心角色

    抽象类(Abstraction): 维护了Implementor,即它的实现子类Concretelmplementor,二者是聚合关系,Abstraction充当桥接类
    ConcreteAbstraction: 是Abstraction抽象类的子类
    Implementor: 行为实现类的接口
    ConcreteImplementor: 行为的具体实现类
    Client类: 桥接模式的调用者

    注意:对应我们例子中角色
    Abstraction–》台式还是笔记本
    ConcreteAbstraction–》台式笔记本具体实现
    Implementor–》电脑牌子
    ConcreteImplementor–》电脑牌子具体实现
    Client–Main:测试类。

    UML类图

    在这里插入图片描述

    实现代码:我们举这样一个栗子,作为计算机专业的我们,一台电脑是必不可少的,但是我们该选择台式机还是笔记本呢?又该选择什么牌子的电脑呢?这俩个都是不同维度的一些变化,所以需要单独考虑,先选择台式机还是笔记本,然后再选择电脑的牌子。最终组合我们最想要的电脑。那么,让我们一起来组装一台合适的电脑吧!

    Computer 类
    package com.bridge;
    
    public class Computer {
    	
    	protected Brand brand;
    	
    	public Computer(Brand b) {
    		this.brand = b;
    	}
    	
    	public void chooseComputer(){
    		brand.chooseBrand();
    	}
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    Desktop 类
    package com.bridge;
    
    public class Desktop extends Computer {
    
    	public Desktop(Brand b) {
    		super(b);
    	}
    	
    	@Override
    	public void chooseComputer() {
    		super.chooseComputer();
    		System.out.println("我们选择的电脑类型是--->台式机");
            System.out.println("组装完成。。。。。。。。");
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    Laptop 类
    package com.bridge;
    
    public class Laptop extends Computer {
    	
    	public Laptop(Brand b) {
    		super(b);
    	}
    	
    	@Override
    	public void chooseComputer() {
    		super.chooseComputer();
    		System.out.println("我们选择的电脑类型是--->笔记本");
            System.out.println("组装完成。。。。。。。。");
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    Brand 类
    package com.bridge;
    
    public interface Brand {
    	void chooseBrand();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    Lenovo 类
    package com.bridge;
    
    public class Lenovo implements Brand {
    
    	@Override
    	public void chooseBrand() {
    		System.out.println("我们选择的电脑品牌是--->联想");
    	}
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    Huawei 类
    package com.bridge;
    
    public class Huawei implements Brand {
    	
    	@Override
    	public void chooseBrand() {
    		System.out.println("我们选择的电脑品牌是--->华为");
    	}
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    客户端测试代码Client-Main
    package com.bridge;
    
    public class Main{
        public static void main(String[] args) {
            Computer  c = new Desktop(new Huawei());
            c.chooseComputer();
            System.out.println("------------------");
            Computer c2 = new Laptop(new Lenovo());
            c2.chooseComputer();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果展示:

    在这里插入图片描述

    好了,到这里【Java中23种面试常考的设计模式之桥接模式(Bridge)—结构型模式】就结束了,23种设计模式持续更新汇总中。

  • 相关阅读:
    客户案例 | 举重若轻,低代码培育核心业务能力工坊
    用python对美女内容采集,舞蹈区内容真热闹~
    前端如何使网页变灰
    101道算法JavaScript描述【二叉树】9
    ROS导航——环境感知(激光雷达)
    特征工程(六)—(1)利用PCA进行特征转换
    virtualbox 下载安装
    io多路复用:select、poll和epoll
    RTI connext 初级入门
    商城小程序开发哪家好?应该怎么选择商城小程序开发系统呢?
  • 原文地址:https://blog.csdn.net/Coder_ljw/article/details/127582610
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号