怎么提高程序设计能力?可以参考程序-设计原则,程序-设计模式

news2024/11/26 8:17:28

怎么提高程序设计能力?

简单说下我的方式方法:

【程序架构】

借鉴设计模式和设计原则

【程序业务】

多理解客户需求,理解后,做竞品逻辑分析,分析出其逻辑结构,和数据结构 ;

再根据客户需求结合竞品分析出的数据,设计客户所需的数据结构和程序业务

【总结】 满足上面两种方法后,做下面的就轻松多了


设计原则

分别为【单一职责】【里氏替换】【 迪米特法则】【依赖倒置原则】【接口隔离原则】【开闭原则】【合成/聚合复用原则】

在程序设计中,我们往往要遵循着六个原则:


1、单一职责原则:

就一个类而言,应该仅有一个引起它变化的原因。
避免一个类负责多个功能的实现,当发生更改时影响其他功能而致使复用成为不可能。


2、里氏替换原则:

派生类(子类)对象能够替换其基类(父类)对象被调用。
即在程序中,任何调用基类对象实现的功能,都可以调用派生类对象来替换。


3、依赖倒置原则:

程序设计应该依赖抽象接口,而不应该依赖具体实现。
即接口编程思想,接口是稳定的,实现是不稳定的,一旦接口确定,就不应该再进行修改了。根据接口的实现,是可以根据具体问题和情况,采用不同的手段去实现。


4、接口隔离原则:

使用多个隔离接口,比使用单个接口要好。
经常提到的降低耦合,降低依赖,主要也是通过这个原则来达到的


5、迪米特法则:

一个实体应当尽可能少的与其他实体之间发生相互作用。


6、开闭原则:

程序的设计应该是不约束扩展,即扩展开放,但又不能修改已有功能,即修改关闭。


7、合成/聚合复用原则:

在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新的对象通过这些对象的委派达到复用已有功能的目的。设计原则是:尽量使用合成/聚合,尽量不要使用继承。 


设计模式

1.简单工厂
2.工厂方法
3.抽象工厂
4.建造者模式
5.原型模式
6.单例模式:又分为饿汉式单例、懒汉式单例
7.适配器模式
8.桥接模式
9.组合模式:又分为透明组合模式、安全组合模式
10.装饰器模式
11.外观模式
12.享元模式
13.代理模式
14.职责链模式(责任链模式)
15.命令模式
16.解释器模式
17.迭代器模式
18.中介者模式
19.备忘录模式
20.观察者模式
21.状态模式
22.策略模式
23.模板方法模式
24.访问者模式

一、什么是设计模式?

       答:程序都是通过写代码来实现的,老前辈们在开发程序的过程中,为了解决某一类问题,日积月累总结出了一套套的代码编写经验,通过这些经验,按照套路出牌,可以让开发出来的代码复用性强、可靠性高、阅读性好。复用性强意味着我们能减少代码开发,更方便后期代码维护;这些经验都是老前辈们经过千锤百炼,替我们解决了很多代码编写过程中可能遇到的坑,慢慢的积累而来的,具有更高的可靠性;程序员学会了这些套路经验,对于使用这些套路的编写的代码来说,我们能够更好的阅读别人的代码。所以,这些编码经验就被热情的程序员牛人们总结出来,形成了一条条的编码套路,把这些套路应用到特定的编码场合,用于解决相似的问题,我们把这些套路叫做设计模式。

二、设计模式的分类

根据目的(模式是用来做什么的)可分为创建型(Creational),结构型(Structural)和行为型(Behavioral)三类:

 创建型模式

主要用于创建对象

结构型模式

主要用于处理类或对象的组合

行为型模式

主要用于描述类或对象如何交互和怎样分配职责

三、模式分类-创建型模式

1.简单工厂

定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。

 

  • 不符合开闭原则
  • 简单工厂模式的简化:将抽象产品类和工厂类合并,将静态工厂方法移至抽象产品类中

 

2.工厂方法

定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。

​​​​​​​

  • 符合开闭原则

3.抽象工厂

提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。

  • 新增产品族支持开闭原则
  • 新增产品结构违背开闭原则

4.建造者模式

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

 

 5.原型模式

使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。

  • 浅克隆和深克隆
  • 违背开闭原则

6.单例模式

确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。

【要点:】

  • 某个类只能有一个实例
  • 必须自行创建这个实例
  • 必须自行向整个系统提供这个实例

 6.1.饿汉式单例类

属性就是单例,直接getinstance就可以

6.2.懒汉式单例类

锁方法延迟,双重锁定,两次判断instance==null

四、模式分类-结构型模式

结构型模式(Structural Pattern)关注如何将现有类或对象组织在一起形成更加强大的结构

不同的结构型模式从不同的角度组合类或对象,它们在尽可能满足各种面向对象设计原则的同时为类或对象的组合提供一系列巧妙的解决方案

 7.适配器模式

将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。

 8.桥接模式

将抽象部分与它的实现部分解耦,使得两者都能够独立变化。

 

 9.组合模式

组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象。

 

9.1.透明组合模式

抽象构建就声明函数

  • 好处,客户端一视同仁
  • 问题,不安全

9.2.安全组合模式

抽象构件就一个operation,剩下的要在composite里自己声明

  • 问题,不透明,区别对待叶子和容器

10.装饰器模式

动态地给一个对象增加一些额外的职责。就扩展功能而言,装饰模式提供了一种比使用子类更加灵活的替代方案。

 11.外观模式

为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

 

 facade那里直接init子系统,做个函数都用上就可以了

12.享元模式

通过共享技术实现相同或相似对象的重用

  • 享元池(Flyweight Pool):存储共享实例对象的地方
  • 享元模式:运用共享技术有效地支持大量细粒度对象的复用。

 13.代理模式

给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。

常见的有多种代理模式:远程,虚拟,缓冲,保护,智能引用


1.当客户端对象需要访问远程主机中的对象时可以使用远程代理


2.当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理


3.当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理


4.当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理


5.当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理 

五、模式分类-行为型模式 

  • 行为型模式(Behavioral Pattern) 关注系统中对象之间的交互,研究系统在运行时对象之间的相互通信与协作,进一步明确对象的职责
  • 行为型模式:不仅仅关注类和对象本身,还重点关注它们之间的相互作用和职责划分

14.职责链模式(责任链模式)

避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求。将接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止。

  • 记得抽象类要可以设置下家的函数(successor)

 15.命令模式

将一个请求封装为一个对象,从而让你可以用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。

  • 有一个小套娃,invoker有command,可以调用execute,实现receiver的action

16.解释器模式

给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

  • 非终结部分需要两个抽象表达符号,递归进行interpret

17.迭代器模式

提供一种方法顺序访问一个聚合对象中各个元素,且不用暴露该对象的内部表示。

  • 符合开闭原则,如果不动迭代器方法的话
  • 用在访问聚合对象的内部环境里

 18.中介者模式

定义一个对象来封装一系列对象的交互。中介者模式使各对象之间不需要显式地相互引用,从而使其耦合松散,而且让你可以独立地改变它们之间的交互。

  • 是迪米特法则的典型应用

 

 19.备忘录模式

在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以在以后将对象恢复到原先保存的状态。

 20.观察者模式

定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新。

  • 目标类中应该含有观察者列表
  • 增加新的具体目标类,在一定程度上违背了开闭原则
  • 但是整体是符合开闭原则的。增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便

21.状态模式

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

  • request:调用对应状态的handle
  • 对于开闭原则的支持性不太好

22.策略模式

定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法可以独立于使用它的客户变化。

 使用环境:

  • 一个系统需要动态地在几种算法中选择一种
  • 避免使用难以维护的多重条件选择语句
  • 不希望客户端知道复杂的、与算法相关的数据结构,提高算法的保密性与安全性

23.模板方法模式

定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类不改变一个算法的结构即可重定义该算法的某些特定步骤。

  • 如果需要更换或增加具体子类,无须修改源代码,只需修改配置文件即可,符合开闭原则
  • 也符合单一职责原则
  • 可以配合桥接模式

24.访问者模式

表示一个作用于某对象结构中的各个元素的操作。访问者模式让你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

  • 开闭原则的倾斜性
  • 访问者模式可以和组合模式联用

  • 一个对象结构包含多个类型的对象,希望对这些对象实施一些依赖其具体类型的操作
  • 需要对一个对象结构中的对象进行很多不同的且不相关的操作,并需要避免让这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类
  • 对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作


参考/转载

程序设计模式23+1种定义+UML图(有部分分析和联用)_dor.yang的博客-CSDN博客_程序设计模式

程序设计之设计模式介绍 - 我若安好,便是晴天 - 博客园

    程序设计的六大原则_biyusr的博客-CSDN博客_程序设计原则

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/143588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自己有工厂,怎样接外贸订单?

很多做外贸的小工厂和小型加工厂,除了传统的营销渠道外,也不知道如何做、才能接到外贸订单。小工厂想获得外贸订单,可通过以下7个方法:1、注册一些外贸B2B平台,发布产品,等待客户询盘外贸B2B平台太多了&…

商务车改装之奔驰威霆改装

今天来看看这台车的改装效果,首先外观改成GLS的一个包围。同时大灯换了一个三道杠的运动大灯。运动大灯加上包围,是不是时尚了很多。再来看看威霆内饰,白红相间的色彩搭配,仪表台换成一个大连屏的仪表台,带着飞机一样的…

4路DI开关检测计数器NPN/PNP输入,Modbus TCP协议,WiFi模块YL160频率测量 计数器

特点:● 4路开关量输入,支持NPN和PNP输入● DI每一路都可用作计数器或者频率测量● 支持Modbus TCP 通讯协议● 可以设置每转脉冲数用于转速测量● 内置网页功能,可以通过网页查询电平状态● 可以通过网页设定输出状态● 宽电源供电范围&…

OPC Expert v8.1.2211 Crack

像专业人士一样解决您的 OPC 和 DCOM 连接问题 [无需经验] 快速修复 OPC 和 DCOM 错误 使用 OPC Expert,您无需任何经验即可解决和修复 OPC 连接问题。OPC Expert 为您完成繁重的工作,以快速自动诊断 OPC 和 DCOM 问题……Ω578867473而且还不止于此。OP…

基于Java+SpringBoot+vue+element实现餐厅点餐系统平台

基于JavaSpringBootvueelement实现餐厅点餐系统平台 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录基于JavaSpringBo…

ATGM336H-5N定位导航模块介绍

ATGM336H-5N定位导航模块简介ATGM336H-5N系列模块是9.7X10.1尺寸的高性能BDS/GNSS全星座定位导航模块系列的总称。该系列模块产品都是基于中科微第四代低功耗GNSSSOC 单芯片—AT6558,支持多种卫星导航系统,包括中国的BDS(北斗卫星导航系统&am…

基于Java+SpringBoot+vue+element实现火车订票平台管理系统

基于JavaSpringBootvueelement实现火车订票平台管理系统 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取…

足球视频AI(五)——球员与球的对象跟踪

一、基础概念 在之前的四节中,我们尝试解决: 1,球员识别、足球识别、裁判识别; 2,队伍的分类 3,平面坐标的换算 存在关键的问题是:每一帧的画面,每次都是重新识别,无…

【OpenCV】数字图像的表示 | 图像IO操作接口 | 图像混合操作

Ⅰ. 数字图像的表示 0x00 位数 计算机采用0/1编码的系统,数字图像也是利用0/1来记录信息。 我们平常接触的图像都是8位数图像,包含0~255灰度。 0:代表最黑 1:表示最白0x01 二值图像 一幅二值图像的二维矩阵仅由0、1…

VTK-vtkAbstractTransform及其子类

前言:本博文主要研究vtkAbstractTransform及其子类的实现原理,以及由此扩展的类。 目录 vtkAbstractTransform vtkGeneralTransform vtkGeoSphereTransform(9.0.3中没有该接口) vtkGeoTransform(9.0.3中没有该接口) vtkHomogeneousTransform vtkId…

企业微信客户联系自定义工具栏开发

一、问题说明:企业微信中私聊微信客户,在聊天输入框上面有一行快捷工具,这边怎么自定义开发?如下图,我们可以点击快捷发送,然后弹出一个页面,页面中有我们需要发送给当前会话的各种资源&#xf…

Maven高级-聚合-继承

多模块构建维护 作用&#xff1a;聚合用于快速构建maven工程&#xff0c;一次性构建多个项目/模块。 制作方式&#xff1a; 创建一个空模块&#xff0c;打包类型定义为pom <packaging>pom</packaging>定义当前模块进行构建操作时关联的其他模块名称 <modules&g…

2021年MathorCup高校数学建模挑战赛—大数据竞赛B题信息流智能推荐算法中的序列评估问题求解全过程文档及程序

2021年MathorCup高校数学建模挑战赛—大数据竞赛 B题 信息流智能推荐算法中的序列评估问题 原题再现&#xff1a; 随着互联网信息的蓬勃发展&#xff0c;用户在使用互联网应用时面临着信息过载的问题。推荐算法的出现&#xff0c;满足了用户个性化的内容消费需求&#xff0c;…

分布式任务调度系列 - XXL-JOB

一、前言 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 二、传统的定时任务 1. 概念 1.1、定时任务的基本概念 程序为解决一个信息处理任务而预先编制的工作执行方案&#xff0c;这就是定时任务&#xff0c;核心组成如下&#xff1a; 执行器&#…

28个数据可视化图表的总结和介绍

数据可视化本身就是一种通用语言。我们这里通用语言的意思是&#xff1a;它能够向各行各业的人表示信息。它打破了语言和技术理解的障碍。数据是一些数字和文字的组合&#xff0c;但是可视化可以展示数据包含的信息。 “数据可视化有助于弥合数字和文字之间的差距”——Brie E…

C++入门——引用

1.概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用的变量共用同一块内存空间 类型& 引用变量名(对象名) 引用实体&#xff1b; 而引用类型必然要与引用实体的类型一致。 …

下载微信小程序中的视频

工具准备&#xff1a;Fiddler 我这里用的5.0的版本。&#xff08;这个用来抓取视频下载地址&#xff09;Internet Download Manager&#xff08;idm&#xff09;版本6.37&#xff08;这个用来下载视频&#xff09;步骤&#xff1a;打开Fiddler如下图配置后抓包2.登录PC版微信&a…

1.5日报

今天完成项目环境的搭建&#xff0c;并成功剥离TestMrl相关接口&#xff0c;并成功运行 遇到的问题&#xff1a; 缺少 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <v…

展望2023,回首2022,让我们一起努力

回首2022 时光如白驹过隙般&#xff0c;飞逝而过。时光荏苒&#xff0c;日月如梭。不知不觉中&#xff0c;充满希望与光明的2023年已经到来了。回首2022年&#xff0c;有喜悦&#xff0c;有失落&#xff0c;有艰辛与困难&#xff0c;也有解决困难后的欣慰&#xff0c;有着无数…

第03章 运算符

运算符介绍 运算符是一种特殊的符号&#xff0c;用以表示数据间的运算、赋值和比较等。 算数运算符 算数运算符用于对数值型变量间的计算。 注意&#xff1a;图片中最后一行&#xff0c;字符串相加的结果中间没有空格&#xff0c;这个课件错误❌。 除法[ / ] System.out.pr…