迈出从3K到1W的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问:

        为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。

        为什么用户提出需求变更后,大牛只需潇洒地敲敲键盘,改改配置;而自己将代码改了又改,删了又建,几乎晕厥,最后只能推翻重来。

        为什么大牛写完的程序测试上线后,几乎完美运行,用户无懈可击;而自己的程序bug重重,改好一个却又引出另一个,按下葫芦浮起瓢,几近崩溃。

        为什么同样是程序员,大牛工资1W,而自己只能拿区区的3K?

        大牛显然知道一些小菜所不知道的秘密,这秘密又是什么呢?

        这个秘密就是设计模式。设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。只有精通了设计模式,才敢说真正理解了软件工程。可以说,设计模式是每一个架构师所必备的技能之一。作为一个面向对象设计程序员,只有精通了设计模式,才能完成自身价值从3K到1W的飞跃,才能摆脱码奴的命运,成为一个真正的软件工程师。

        提到设计模式,不得不感谢GoF(Gang of Four,四人组),他们1995年出版的《设计模式》一书,第一次将设计模式提升到理论高度,并将之规范化。书中一共总结了23种基本的设计模式。而这23中设计模式几乎涵盖了面向对象设计过程中所有问题的解决方案。书中提到的23种设计模式分别是:

1.单例模式 2.工厂方法模式 3.抽象工厂模式 4.模版方法模式 5.建造者模式 6.代理模式 7.原型模式 8.中介者模式 
9.命令模式 10.责任链模式 11.装饰模式 12.策略模式 13.适配器模式 14.迭代器模式 15.组合模式 16.观察者模式 
17.门面模式 18.备忘录模式 19.访问者模式 20.状态模式 21.解释器模式 22.享元模式 23.桥梁模式

        那么如此多的设计模式又是从何而来呢?《易经》有云:“易有太极,是生两仪,两仪生四象,四象生八卦”,意思就是说世界万物皆有起源。而设计模式的起源是面向对象程序设计思想,是面向对象设计的精髓——抽象。面向对象通过类和对象来实现抽象,实现时产生了面向对象的三个重要机制:封装、继承、多态。正是这三个机制衍生出了各种各样的设计模式。在面向对象软件设计的发展过程中,除了《设计模式》一书中提到的23中设计模式之外,新的设计模式仍然不断出现。

        从面向过程到面向对象是软件设计诞生以来的迈出的最伟大的一步,面向对象程序设计成功解决了面向过程软件编程的低效率问题,并且彻底改变了人们的编程思维,为软件设计揭开了新的篇章。然而,要实现面向对象设计,彻底摆脱面向过程设计思维,并不仅仅是只要使用了一门面向对象的编程语言就能够达到的。使用面向对象设计,可以设计出优秀的软件,同样也可以设计出糟糕的软件。只有遵循一些特定的原则,才能设计出复用性高灵活性好的软件来。

在运用面向对象的思想进行软件设计时,需要遵循的原则一共有6个,他们是:

1.  单一职责原则(Single Responsibility Principle)
2.  里氏替换原则(Liskov Substitution Principle)
3.  依赖倒置原则(Dependence Inversion Principle)
4.  接口隔离原则(Interface Segregation Principle)
5.  迪米特法则(Low Of Demeter)
6.  开闭原则(Open Close Principle)

        在软件设计的过程中,只要我们尽量遵循以上六条设计原则,设计出来的软件一定会是一个优秀的软件,它必定足够健壮、足够稳定,并以极大的灵活性来迎接随时而来的需求变更等因素。当完全明白这六个原则的含义时,小菜便完成了走向大牛的蜕变。


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

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

相关文章

使用pip安装virtualenv时出现问题

使用pip出现问题 fxd0ubuntu:~$ sudo pip install virtualenv [sudo] password for fxd0: env: ‘pip’: No such file or directory fxd0ubuntu:~$ pip insatall virtualenv Command pip not found, but can be installed with: sudo apt install python-pip 安装pip fxd0…

jquery 获取 outerHtml 包含当前节点本身的代码

在开发过程中,jQuery.html() 是获取当前节点下的html代码,并不包含当前节点本身的代码,然后我们有时候确需要,找遍jQuery api文档也没有任何方法可以拿到。 看到有的人通过parent().html(),如果当前元素没有兄弟元素还…

拥塞控制中的开环和闭环控制

拥塞控制是很难设计的,因为它是一个动态的问题,许多情况下,甚至正式拥塞控制机制本身成为引起网络性能恶化甚至死锁的原因。从控制理论的角度来看拥塞控制这个问题,可以分为开环控制和闭环控制两种方法。开环控制就是在设计网络时…

c语言编写一个菜单系统_一招教你,轻松解决C语言编写一个正整数的所有因子!...

这个实例是一个能提高分析能力的实例,这个实例主要用到for语句,关键是如何确定其中变量的范围。求一个正整数的所有因子先来看看编程结果演示:编程演示输出结果编程如下:#include/*引用预处理命令,预处理包含stdio.h的头文件*/mai…

【简明笔记】循环条件的优化

[javascript] view plaincopy/* * 优化循环 */ //优化前 for(var i0; i < items.length; i){ //判断条件&#xff1a;(1)i<items.length; (2)i<items.length true; process(items[i]); } //优化后 var count items.length; //把length属性放在局…

ubuntu18.04安装mysql数据库

mysql安装参考&#xff1a; https://www.cnblogs.com/opsprobe/p/9126864.html 文中写的很详细&#xff0c;但是未进行初始密码的修改&#xff0c;初始密码修改参考文章&#xff1a; https://blog.csdn.net/qq_38737992/article/details/81090373

第四次Scrum编码冲刺!!!!

第四次Scrum编码冲刺&#xff01;&#xff01;&#xff01;&#xff01; 一、总体任务&#xff1a; 本次冲刺是完成对图书馆管理系统的最后三个功能的实现------管理员对用户授权、用户注销和用户查询 二、个人任务及完成情况&#xff1a; 本人本次的任务是实现对删除用户功能以…

Spring Cloud Edgware新特性之八:Zuul回退的改进

为什么80%的码农都做不了架构师&#xff1f;>>> Spring Cloud Edgware对Hystrix回退的逻辑进行了一些改进。本文将信息探讨新旧版本的回退操作&#xff0c;并分析的原因及改进后的优势。 Dalston及更低版本 对于Dalston及更低版本&#xff0c;要想为Zuul提供回退&a…

因特网 以太网 互联网的含义及区别

互联网是Internet的意译&#xff0c;因特网是Internet的音译&#xff0c;两者是等同的&#xff0c;是一个全世界范围的广域网。目前应用最为广泛的一类局域网是总线局域网-以太网。以太网的核心技术是它的随机争用型介质访问控制方法&#xff0c;即带有冲突检测的载波侦听多路访…

idea插件导出_Intellij IDEA 中我一直在用的几个插件

提前声明一下&#xff0c;今天这篇文章是在我家的那台 Mac 机子上写的&#xff0c;但是文中使用的快捷键还是主要针对于 Windows 平台「由于我的大多数读者在使用该系统&#xff0c;我是有多么爱你们&#xff5e;&#xff5e;&#xff5e;」。接上一篇《谈谈我与 Intellij IDEA…

打开.md格式文件的方式

我们平常偶尔会收到后缀为*.md的文件&#xff0c; md是简称&#xff0c;它的全名为MARKDOWN。MARKDOWN是一种标记语言软件&#xff0c;下载安装MarkdownPad2即可打开。 具体安装参考文章&#xff1a;MarkdownPad2安装汉化与注册码 https://blog.csdn.net/weixin_40612082/art…

吃透理财三句话人人都能成百万富翁

财专家告诉我们&#xff1a;理财的最佳方式并非追求高超的金融投资技巧&#xff0c;只要你掌握正确的理财观念&#xff0c;并且持之以恒&#xff0c;若干年之后——人人都能成为百万富翁。我每月到企业举办一小时的免费“理财讲座”&#xff0c;一直都很受员工们的欢迎。讲座内…

Apache - Storm

一、Apache Storm Storm是一个分布式的&#xff0c;可靠的&#xff0c;容错的数据流处理系统。Storm集群的输入流由一个被称作spout的组件管理&#xff0c;spout把数据传递给bolt&#xff0c;bolt要么把数据保存到某种存储器&#xff0c;要么把数据传递给其它的bolt。一个Stor…

Python基础学习五 内置模块

time 模块 1 >>> import time2 >>> time.time()3 1491064723.8086694 >>> # time.time()返回当前时间的时间戳timestamp(定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数)的方法,无参数5 >>> time.asctime()6 Sun Apr 2…

如何在windows上将本地项目上传到Github

详细步骤参考&#xff1a; https://www.cnblogs.com/smfx1314/p/8426115.html 感谢作者分享&#xff01;

Sublime Text3使用Package Control 报错There Are No Packages Available For Installation

在使用sublime时&#xff0c;有时候我们希望将代码复制出来后仍然是高亮显示&#xff0c;这样我们便需要安装SublimeHighLight插件&#xff0c;在安装SublimeHighLight插件之前&#xff0c;我们应该先安装Package Control插件&#xff01; 1、Package Control插件作用&#xff…

数据结构学习笔记

数据结构学习笔记&#xff08;一&#xff09; 假期以来我都坚持每天看一点郝斌的数据结构视频。讲的很透彻&#xff0c;也很风趣。 前几天都是为讲数据结构而做准备&#xff0c;讲了一些结构体和指针&#xff0c;今天终于开始正式将数据结构。说实话&#xff0c;我今天才知道…

2018-1-27:内存的划分

内存的划分 1.寄存器 2.本地方法区 3.方法区 4.栈内存 存储的都是局部变量&#xff0c;变量的作用域一结束&#xff0c;该变量就立即释放 5.堆内存 存储的是对象&#xff0c;即凡是new的都在堆中 特点&#xff1a;   1.每一个实体都有首地址 2.堆内存中每一个变量都有默认初始…