zl程序教程

您现在的位置是:首页 >  后端

当前栏目

初学Java常用设计模式之——桥接模式和组合模式

JAVA模式设计模式 常用 组合 初学 桥接
2023-09-11 14:17:55 时间

声明:转载请附上原文链接

提示:标题序号从6开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之——适配器模式 序号从5开始。

6.桥接模式(了解)

6.1 桥接模式简介

  • 桥接设计模式
    • 适配器模式类似,包括以后经常会遇到意思接近⼀样的 设计模式,因为⼤神往往就是多个模式混⽤,且根据不 同的场景进⾏搭配,桥接设计模式也是结构型模式
    • 将抽象部分与实现部分分离,使它们都可以独⽴的变化
    • 通俗来说,是通过组合来桥接其它的⾏为/维度
  • 应⽤场景
    • 系统需要在构件的抽象化⻆⾊和具体化⻆⾊之间增加更 多的灵活性
    • 不想使⽤继承导致系统类的个数急剧增加的系统
    • 有时候⼀个类,可能会拥有多个变化维度,⽐如啤酒, 有不同的容量和品牌,可以使⽤继承组合的⽅式进⾏开 发,假如维度很多,就容易出现类的膨胀,使⽤桥接模 式就可以解决这个问题,且解耦
  • 业务背景
我们需要构建⼀个⼿机类,我们知道⼿机有很多品牌,苹果、华
为等,从另外⼀个颜⾊维度,⼜有多种颜⾊,红、⻩、蓝等,

那如果描述这些类的话,传统⽅式就直接通过继承,就需要特别
多的类,品牌2,颜⾊3,就是6个类了,如果后续再增加品牌就
更多了,类数⽬将会激增,即所谓的类爆炸

使⽤桥接模式就可以解决这个问题,且灵活度⼤⼤提⾼

在这里插入图片描述

在这里插入图片描述

6.2 桥接设计模式案例

  • 桥接模式优点
    • 抽象和实现的分离
    • 优秀的扩展能⼒,符合开闭原则
  • 桥接模式缺点
    • 增加系统的理解与设计难度
    • 使⽤聚合关联关系建⽴在抽象层,要求开发者针对抽象 进⾏设计与编程,⽐如抽象类汽⻋,⾥⾯聚合了颜⾊ 类,有点像对象适配器
  • 总结和对⽐
    • 按GOF的说法,桥接模式和适配器模式⽤于设计的不同 阶段
      • 桥接模式⽤于设计的前期,精细化的设计,让系统 更加灵活
      • 适配器模式⽤于设计完成之后,发现类、接⼝之间 ⽆法⼀起⼯作,需要进⾏填坑
    • 适配器模式经常⽤在第三⽅API协同⼯作的场合,在功能集成需求越来越多的今天,这种模式的使⽤频度越来 越⾼,包括有些同学听过 外观设计模式 ,这个也是某 些场景和适配器模式⼀样

就以手机这个为例子直接上代码:

/**
 * @Auther: csp1999
 * @Date: 2020/11/09/21:07
 * @Description: 抽象角色 手机
 */
public abstract class Phone {

    /**
     * 通过组合的方式来桥接其他行为(核心)
     */
    protected Color color;

    public void setColor(Color color) {
        this.color = color;
    }

    /**
     * 手机的方法
     */
    abstract public void run();
}
/**
 * @Auther: csp1999
 * @Date: 2020/11/09/21:08
 * @Description: 手机颜色接口
 */
public interface Color {

    void useColor();
}
/**
 * @Auther: csp1999
 * @Date: 2020/11/09/21:38
 * @Description:
 */
public class BlueColor implements Color {
    @Override
    public void useColor() {
        System.out.println("蓝色...");
    }
}

/**
 * @Auther: csp1999
 * @Date: 2020/11/09/21:12
 * @Description:
 */
public class RedColor implements Color {
    @Override
    public void useColor() {
        System.out.println("红色...");
    }
}

/**
 * @Auther: csp1999
 * @Date: 2020/11/09/21:13
 * @Description:
 */
public class YellowColor implements Color {
    @Override
    public void useColor() {
        System.out.println("黄色...");
    }
}
/**
 * @Auther: csp1999
 * @Date: 2020/11/09/21:39
 * @Description:
 */
public class HWPhone extends Phone {
    public HWPhone(Color color) {
        super.setColor(color);
    }

    @Override
    public void run() {
        color.useColor();
        System.out.println("华为手机...");
    }
}

/**
 * @Auther: csp1999
 * @Date: 2020/11/09/21:40
 * @Description: 手机的实例化
 */
public class ApplePhone extends Phone {

    public ApplePhone(Color color) {
        super.setColor(color);
    }

    @Override
    public void run() {
        color.useColor();
        System.out.println("苹果手机...");
    }
}

/**
 * @Auther: csp1999
 * @Date: 2020/11/09/21:40
 * @Description:
 */
public class SXPhone extends Phone {

    public SXPhone(Color color) {
        super.setColor(color);
    }

    @Override
    public void run() {
        color.useColor();
        System.out.println("三星手机...");
    }
}

调用测试:

@Test
public void testBridge() {
    HWPhone hwPhone = new HWPhone(new BlueColor());
    hwPhone.run();
    ApplePhone applePhone = new ApplePhone(new RedColor());
    applePhone.run();
}

输出结果:

蓝色...
华为手机...
红色...
苹果手机...

7. 组合设计模式(了解)

7.1 组合设计模式简介

  • 组合设计模式
    • ⼜叫部分整体模式,将对象组合成树形结构以表示“部 分-整体”的层次结构,可以更好的实现管理操作
    • 组合模式使得⽤户可以使⽤⼀致的⽅法操作单个对象和 组合对象
    • 部分-整体对象的基本操作多数是⼀样的,但是应该还 会有不⼀样的地⽅
    • 核⼼:组合模式可以使⽤⼀棵树来表示
  • 应⽤场景
    • 银⾏总⾏,总⾏有前台、后勤、⽹络部⻔等,辖区下还 有地⽅分⾏,也有前台、后勤、⽹络部⻔,最⼩的分⾏ 就没有⼦分⾏了
    • 公司也是,总公司下有⼦公司,每个公司⼤部分的部⻔ 都类似
    • ⽂件夹和⽂件,都有增加、删除等api,也有层级管理 关系
    • 当想表达对象的部分-整体的层次结构
    • 当我们的要处理的对象可以⽣成⼀颗树形结构,我们要 对树上的节点和叶⼦进⾏操作时,它能够提供⼀致的⽅ 式,⽽不⽤考虑它是节点还是叶⼦
  • ⻆⾊
    • 组合部件(Component):它是⼀个抽象接⼝,表示 树根,例⼦:总⾏
    • 合成部件(Composite):和组合部件类似,也有⾃⼰ 的⼦节点,例⼦:总⾏下的分⾏
    • 叶⼦(Leaf):在组合中表示⼦节点对象,注意是没有 ⼦节点,例⼦:最⼩地⽅的分⾏

组合设计模式实际上用的比较少,就不再花文章讲述,给大家推荐一篇文章自行了解:JAVA设计模式——组合模式

之后我会陆续更新其他设计模式博文,如果文章对您有帮助,希望点个赞/收藏/关注! O(∩_∩)O~