首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式 (一)设计模式七大原则,UML 基本介绍

设计模式 (一)设计模式七大原则,UML 基本介绍

作者头像
一写代码就开心
发布于 2022-06-19 07:55:39
发布于 2022-06-19 07:55:39
41100
代码可运行
举报
文章被收录于专栏:java和pythonjava和python
运行总次数:0
代码可运行

目录

1 设计模式七大原则

● 1)单一职责原则 ● 2)接口隔离原则 ● 3)依赖倒转原则 ● 4)里氏替换原则 ● 5)开闭原则 ● 6)迪米特法则 ● 7)合成复用原则

1.1 单一职责原则

对类来说的,即一个类应该只负责一项职责。如类A负责两个不同职责:职责1,职责2。当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2

● 1)降低类的复杂度,一个类只负责一项职责 ● 2)提高类的可读性,可维护性 ● 3)降低变更引起的风险 ● 4)通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则

1.2 接口隔离原则

客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上

1.3 依赖倒转原则

● 1)高层模块不应该依赖低层模块,二者都应该依赖其抽象 ● 2)抽象不应该依赖细节,细节应该依赖抽象 ● 3)依赖倒转(倒置)的中心思想是面向接口编程 ● 4)依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在java中,抽象指的是接口或抽象类,细节就是具体的实现类 ● 5)使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
总之:

就是使用接口实现代码,比如,参数是接口类型
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1  我们不使用这个原则,那么参数就是具体的类,那么只能使用特定的类对象了
   对象里面的方法也是特定的,这样不好
2  我们可以写一个接口,接口里面定义一个方法,让其他类实现这个接口,并且重写
   里面的方法,那么,作为参数,就有很多的实现类了

● 1)低层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性更好 ● 2)变量的声明类型尽量是抽象类或接口,这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序扩展和优化 ● 3)继承时遵循里氏替换原则

1.3.1 依赖关系传递的三种方式

1 接口传递

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//方式1:通过接口传递实现依赖
//开关的接口
interface IOpenAndClose {
    void open(ITV tv);//抽象方法,接收接口
}
//ITV接口
interface ITV {
    void play();
}
//实现接口
class OpenAndClose implements IOpenAndClose {
    public void open(ITV tv){
        tv.play();
    }
}

2 构造方法传递

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//方式2:通过构造函数实现依赖
//开关的接口
interface IOpenAndClose {
    void open();//抽象方法
}
//ITV接口
interface ITV {
    public void play();
}
//实现接口
class OpenAndClose implements IOpenAndClose {
    private ITV tv; // 成员
    
    public OpenAndClose(ITV tv){ // 构造器
        this.tv = tv;
    }
    
    public void open(){
        this.tv.play();
    }
}

3 setter 方式传递

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//方式3,通过setter方法传递
interface IOpenAndClose{
    void open();//抽象方法
    void setTv(ITV tv);
}
//ITV接口
interface ITV{
    void play();
}
//实现接口
class OpenAndClose implements IOpenAndClose{
    private ITV tv;
    public void setTv(ITV tv){
        this.tv=tv;
    }
    public void open(){
        this.tv.play();
    }
}

1.4 里氏替换原则

在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法

1.4.1 问题

如果有的人就想重写父类里面的方法,咋办

1.4.2 解决

将方法提取出来到一个新类里面,比如C 是新类,让A ,B 继承C ,重写C里面的方法就可以了

  • 1 如果 即使变成这样,A还是想用B里面的方法咋办 在A 类里面创建B的对象,自己新写一个方法,里面使用B里面的方法

1.5 开闭原则

我们一般在新增功能的时候,一般要修改代码,但是这个原则是尽量少修改,要新增代码,而不是修改原来的代码;

抽象类+接口 实现功能

1.6 迪米特法则

迪米特法则又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。

1.7 合成复用原则

原则是尽量使用合成/聚合的方式,而不是使用继承;

2 UML 基本介绍

类之间的关系:依赖、泛化(继承)、实现、关联、聚合与组合

2.1 依赖

只要是在类中用到了对方,那么他们之间就存在依赖关系。如果没有对方,连编译都通过不了; 比如一个A类里面,属性是B类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1)类中用到了对方
● 2)类的成员属性
● 3)方法的返回类型
● 4)方法接收的参数类型
● 5)方法中使用到

2.2 泛化

泛化关系实际上就是继承关系,它是依赖关系的特例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1)泛化关系实际上就是继承关系
● 2)如果 A 类继承了 B 类,我们就说 AB 存在泛化关系

2.3 实现

就是实现接口,它是依赖关系的特例

2.4 关联

它是依赖关系的特例;

关联关系实际上就是类与类之间的联系; 单向一对一; 双向一对一;

2.5 聚合

一个整体可以分离出来单独使用

2.6 组合

不能分离出来单独使用,共生共灭

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式——七大原则
设计模式——七大原则
Java架构师必看
2021/05/14
3240
设计模式七大原则
编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的挑战,设计模式是为了让程序(软件),具有如下特征:
星哥玩云
2022/09/14
3250
设计模式七大原则
设计模式----七大原则和UML类图
之前的支付案例,就是满足开闭原则的一个经典案例,当我们需要增加新的支付方式时,只需要增添一个接口的实现类即可,其余地方代码不需要做改动
大忽悠爱学习
2021/11/15
3370
图解Java设计模式之设计模式七大原则
编写软件过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让程序(软件)。具有更好 1)代码重用性(即:相同功能的代码,不用多次编写) 2)可读性(即:编程规范性,便于其他程序员的阅读和理解) 3)可扩展性(即:当需要增加新的功能时,非常的方便,称为可维护) 4)可靠性(即:当我们增加新的功能后,对原来的功能没有影响) 5)使程序呈现高内聚,低耦合的特性 6)设计模式包含了面向对象的精髓,“懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要“ 7)Scott Mayers 在其巨著《Effective C++》就曾经说过 :C++老手和C++新手的区别就是前者手背上有很多伤疤
海仔
2020/02/18
4960
图解Java设计模式之设计模式七大原则
设计模式常用的七大原则
编写软件过程中, 程序员面临着来自 耦合性, 内聚性以及可维护性, 可扩展性, 重用性, 灵活性等多方面的挑战, 设计模式是为了让程序(软件), 具有更好的
彼岸舞
2022/05/28
3380
设计模式常用的七大原则
一篇文章让你读懂设计模式的七大原则;不要错过
主要是为了在编码过程中面临着来自耦合性、内聚性以及可维护性、重用性、灵活性等多方面的挑战
@派大星
2023/06/28
1420
一篇文章让你读懂设计模式的七大原则;不要错过
设计模式七大原则(1.2)
设计模式原则是设计设计模式的原则,也就是设计模式应当如何设计所遵守的原则;换句话说,设计模式的设计是基于设计模式原则的。
Noneplus
2019/09/24
4190
设计模式七大原则(1.2)
设计模式概念和七大原则
在GoF(Gang of Four)的书籍《Design Patterns - Elements of Reusable Object-Oriented Software(设计模式-可复用面向对象软件的基础)》中是这样定义设计模式的:Christopher Alexander说过:“每一个模式描述了一个在我们周围不断重复发生的问题以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动” [AIS+77,第10页]。尽管Alexander所指的是城市和建筑模式,但他的思想也同样适用于面向对象设计模式,只是在面向对象的解决方案里, 我们用对象和接口代替了墙壁和门窗。两类模式的核心都在于提供了相关问题的解决方案。一般而言,设计模式有四个基本要素:
Throwable
2020/06/23
20.6K1
设计模式概念和七大原则
Java设计模式:(1)设计模式七大设计原则-依赖倒转原则
1)依赖倒转原则基于这样的设计理念:相对于细节的多变形,抽象的东西要稳定的多,以抽象为基础搭建的架构比以细节为基础的架构要稳定的多
桑鱼
2020/03/17
4270
设计模式几大原则
单一职责原则(Single Responsibility Principle,SRP):一个类只负责一个功能领域中的相应职责或可以定义为:就一个类而言,应该只有一个引起它变化的原因。
孟君
2020/08/27
4730
设计模式几大原则
设计模式-七大原则(图解一目了然)
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
唔仄lo咚锵
2020/10/09
2.9K0
设计模式-七大原则(图解一目了然)
00_设计模式6大原则
转载自https://www.cnblogs.com/HigginCui/p/6195318.html
allsmallpig
2021/02/25
2530
设计模式学习笔记(一)设计模式六大原则
设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码的可靠性。平常主要有这样的三大类型:
归思君
2023/10/16
3430
设计模式学习笔记(一)设计模式六大原则
设计模式六大原则
  单一职责原则又称为单一功能原则,即不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。
那一叶随风
2018/08/22
3050
设计模式六大原则
Java设计模式的七大基本原则
对类来说的,即一个类应只负责一项职责,如果A负责两个不同的职责:1,2。当1需求变更改变A时,可能造成2执行错误,所以需要将A粒度分解为A1,A2。
小尘要自信
2023/10/10
4330
七大原则+23种设计模式
编写软件过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,复用性,灵活性等多方面的挑战,设计模式是为了让程序(软件),具有更好的
devi
2021/08/18
3.3K0
设计模式六大原则
有言曰,“无规矩不成方圆”,有“规”才能画“圆”,那设计模式要遵循的六大原则要画一个什么的“圆”呢?
mingmingcome
2021/11/29
3510
设计模式六大原则
软件设计的七大原则
写出高质量、易维护、高可用的代码是每一个程序员的追求,那么,究竟什么样的代码才是易于维护与扩展的好代码呢?本文,我们就来介绍软件开发过程中的七大原则,一同来管窥一二。
用户3147702
2022/06/27
2.3K0
软件设计的七大原则
设计模式-设计原则
有时候类的功能并不符合类的定义,添加在类中会使得类过于臃肿,此时应该将职责根据定义进行划分,以实现高内聚低耦合。
用户9645905
2023/11/10
1950
java代码设计的6+1大原则
1.开闭原则(Open Close Principle) 定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。 开放-封闭原则的意思就是说,你设计的时候,时刻要考虑,尽量让这个类是足够好,写好了就不要去修改了,如果新需求来,我们增加一些类就完事了,原来的代码能不动则不动。这个原则有两个特性,一个是说“对于扩展是开放的”,另一个是说“对于更改是封闭的”。面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。这就是“开放-封闭原则”的精神所在 比如,刚开始需求只是写加法程序,很快在client类中完成后,此时变化没有发生,需求让再添加一个减法功能,此时会发现增加功能需要修改原来这个类,这就违背了开放-封闭原则,于是你就应该考虑重构程序,增加一个抽象的运算类,通过一些面向对象的手段,如继承、动态等来隔离具体加法、减法与client耦合,需求依然可以满足,还能应对变化。此时需求要添加乘除法功能,就不需要再去更改client及加减法类,而是增加乘法和除法子类即可。 绝对的修改关闭是不可能的,无论模块是多么的‘封闭‘,都会存在一些无法对之封闭的变化,既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化。在我们最初编写代码时,假设变化不会发生,当变化发生时,我们就创建抽象来隔离以后发生同类的变化。 我们希望的是在开发工作展开不久就知道可能发生的变化,查明可能发生的变化所等待的时候越长,要创建正确的抽象就越困难。开放-封闭原则是面向对象设计的核心所在,遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现出现频繁变化的那些部分做出抽象,然而对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意,拒绝不成熟的抽象和抽象本身一样重要。开放-封闭原则,可以保证以前代码的正确性,因为没有修改以前代码,所以可以保证开发人员专注于将设计放在新扩展的代码上。 简单的用一句经典的话来说:过去的事已成历史,是不可修改的,因为时光不可倒流,但现在或明天计划做什么,是可以自己决定(即扩展)的。
lyb-geek
2018/07/26
9840
相关推荐
设计模式——七大原则
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档