乱用继承导致的类爆炸

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
视觉智能开放平台,分割抠图1万点
NLP自然语言处理_基础版,每接口每天50万次
简介: 摘要(Markdown格式):了解**复杂度守恒定律**,源于1984年,指出应用的复杂性无法消除,只能转移。在探究设计模式时,发现了**桥接模式**。桥接模式通过组合而非继承处理多维度变化,避免类爆炸问题。当图形颜色和类型变化时,原本的抽象类和实现类会导致大量类产生。通过桥接模式优化,将颜色和形状解耦,实现了更灵活的结构。

昨天学习设计模式,其中有一个桥接模式让我深刻;

今天中午有复盘一下;

首先说下复杂度守恒定律,这一观点主要被应用在交互设计领域。我们不得不面对的问题是,该由谁来为这一固有的复杂度埋单。打个比方,应该由软件开发工程师花费额外的时间来使软件变得更加简单好用,还是应该让用户自己去解决软件使用中可能存在的问题?

复杂度守恒定律由Larry Tesler于1984年提出,也称泰斯勒定律(Tesler’s Law)。复杂度守恒定律(Law of conservation of complexity)由Larry Tesler于1984年提出,也称泰斯勒定律(Tesler’s Law)。
根据复杂度守恒定律,每个应用程序都具有其内在的、无法简化的复杂度。无论在产品开发环节还是在用户与产品的交互环节,这一固有的复杂度都无法依照我们的意愿去除,只能设法调整、平衡。

桥接模式?,那是个啥” 心中突然蹦出这么一个想法。我心血来潮,去搜索

image-20240616180310518

再去菜鸟教程看看

image-20240616180351799

有一个图形的案列

image-20240616180458923

这时候心里念着”首先有一个图形的基类,然后开始继承走起 红色的圆形、 红色的矩形、 蓝色的圆形、蓝色的矩形。“ 没毛病,一个抽象类,四个实现类,搞定

代码写完,测一手。画出类图

img

    @Test
    void shape(){
   
   
        Shape blueCircle = new BlueCircle();
        Shape blueRectangle = new BlueRectangle();
        Shape redCircle = new RedCircle();
        Shape redRectangle = new RedRectangle();

        blueCircle.create();
        blueRectangle.create();
        redCircle.create();
        redRectangle.create();
    }

结果

蓝色の圆形
蓝色の长方形
红色の圆形
红色の长方形

感觉还可以,如果再加一种形状呢?

再加两个类不就行了? RedTriangle、BlueTriangle,

也还行,如果再这基础上再加一种绿颜色呢

再加三个类 GreenCircle、 GreenRectangle、GreenTriangle”

再加一个椭圆呢

这样就造成类爆炸了

UML中的聚合组合!

img

所以再仔细想想就可以优化代码

bridge1.png

这个就是组合和聚合的意思,同时他们与主体之间的关联关系的表达

相关文章
|
设计模式 算法 Java
JAVA设计模式13:模版方法模式,将一些步骤延迟到子类中实现
JAVA设计模式13:模版方法模式,将一些步骤延迟到子类中实现
【JavaSE专栏57】妙用this和super关键字,让父类和子类之间来回自如
【JavaSE专栏57】妙用this和super关键字,让父类和子类之间来回自如
108 0
|
Java 程序员 编译器
继承的巧妙
继承的巧妙
36 0
|
3月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
68 1
|
8月前
|
XML JSON Java
作为所有类的顶层父类,没想到Object的魔力如此之大!
在上一篇博文中我们提到了Java面向对象的四大特性,其中谈及“抽象”特性时做了一个引子,引出今天的主人公Object,作为所有类的顶级父类,Object被视为是James.Gosling的哲学思考,它高度概括了事务的自然与社会行为。
105 13
|
存储 安全 编译器
【巧妙继承】C++玩转继承的神级技巧
【巧妙继承】C++玩转继承的神级技巧
|
Java
Java面向对象 特征二(继承性)详解
Java面向对象 特征二(继承性)详解
81 0
final关键字:我偏不让你继承
final关键字:我偏不让你继承
138 0
|
Java 编译器 测试技术
Java面向对象的三大特征之继承
Java面向对象的三大特征之继承
|
Java
Java面向对象三大特征之一继承(轻装上阵的子类们)含有查看继承关系快捷键
继承是类和类之间的关系。除此之外,类之间还有依赖、组合、聚合等关系
161 0
Java面向对象三大特征之一继承(轻装上阵的子类们)含有查看继承关系快捷键