设计思想、原则、模式
为能写出高质量的代码,能写出复杂业务逻辑的代码而准备,也为不断提升自己学习
大当家_白
这个作者很懒,什么都没留下…
展开
-
设计模式--行为型--模板模式
主要是用来解决复用和扩张两个问题模板模式,全称模板方法模式,英文名Template Method Design Patterm。模板方法模式在一个方法中定义算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类不改变算法整体结构的情况下,重新定义算法中的某些步骤。这里的"算法",可以理解为业务逻辑,这里的算法骨架就是“模板”,包含算法骨架的方法也称之为模板方法,这也就是模板方法的由来。由上面可以看出。模板模式包含两部分,一部分是提供模板方法和扩展点的父类(Abstrac...原创 2020-07-29 02:59:43 · 122 阅读 · 0 评论 -
设计模式--行为型--观察者模式
原理、实现、场景观察者模式(Observer Design Patteren) 也称之为发布订阅模式(Publish Subscribe Patteren)。定义:在对象之间定义一个对多的依赖,当一个对象状态改变的时候,所依赖的对象都会自动收到通知对于这个模式我更喜欢称之为发布订阅模式,一看就知道这个模式一般使用在一对多的场景,且包含发布者和订阅者两部分。为了基于接口编程,所以发布者包含发布者接口和发布者实现类,同样订阅者也包含订阅者接口和订阅者实现类。类图如下:由类图可以看..原创 2020-07-28 23:34:04 · 104 阅读 · 0 评论 -
设计模式--行为型--迭代器模式
迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern)。用来遍历集合对象。这里的“集合对象”也可以叫作“容器”,实际上就是包含一组对象的对象,比如数组、链表、树、图、跳表等,迭代器模式主要是将集合对象的遍历操作从集合类中拆分,放到迭代器中,让二者职责更加单一。迭代器是用来遍历容器的,所以一个完整的迭代器模式一般包含容器和容器迭代器两个部分。为了遵循基于接口而非实现编程,容器包含容器接口和容器类,迭代器包含迭代器接口和迭代..原创 2020-07-28 11:40:39 · 122 阅读 · 0 评论 -
设计模式--行为型--状态模式
状态模式在实际的软件开发中并不常用,但在能够用到它的场景能够发挥重要作用。状态模式一般用来实现状态机,而状态机常用在游戏、工作流引擎等系统的开发中。不过状态台机的实现有多种,比较常用的是分支逻辑法和查表法状态模式,英文翻译State Pattern。允许对象内部状态发生改变时,对象看起来好像修改了它的类。主要解决:对象行为依赖于它的状态(属性),并且可以根据它的状态来改变它的相关行为。一般用来状态机的实现什么是有限状态机?有限状态机,英文翻译Finite State Mac...原创 2020-07-27 23:41:00 · 189 阅读 · 0 评论 -
设计模式--行为型--职责链模式
职责链模式的原理和实现。主要用于框架中过滤器和拦截器实现职责链模式,英文名Chain Of Responsibility Design Pattern 。将请求的发送和接收者解耦,让多个接收对象都有机会处理这个请求,将这些接收对象串成一条链。并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它。进一步解读:在职责链模式中,多个处理器(也就是刚刚定义中说的“接收对象”)依次处理同一个请求。一个请求先经过A处理器处理,然后再把请求传递给B处理器,B处理器处理完成之后再传递给C处理器..原创 2020-07-27 07:01:58 · 143 阅读 · 0 评论 -
设计模式--行为型--策略模式
策略模式的场景就是,利用策略模式来避免冗长的if-else或者switch分支判断。还可以像模板模式那样,提供框架的扩展点等等。策略模式,英文名Strategy Design Pattern。定义一族算法类,将每个算法类封装起来,让它们可以相互替换。策略模式可以使算法类的变化独立于使用它们的客户端。(客户端指的使调用者)策略模式用来解耦策略的定义、创建和使用。实际上一个完整策略模式就是由这三部分组成起来的。1、策略的定义策略类的定义比较简单,包含一个接口和一组实现这个接口的策略...原创 2020-07-26 23:50:45 · 225 阅读 · 0 评论 -
设计模式-创建型--工厂模式
什么时候使用工厂模式?相比于直接使用new来创建对象,工厂模式有哪些好处?工厂模式分为三种更加细分的类型:简单工厂模式、工厂方法模式以及抽象工厂模式。也有的书籍把简单工厂模式划分为工厂方法模式的一种特列,所以这种划分工厂模式只有两种,分别是工厂方法模式和抽象方法模式。什么时候使用工厂模式?当创建逻辑比较复杂,是一个“大工程”的时候,就可以考虑使用工厂模式,封装对象的创建过程,将对象有创建和使用过程分离。如下面两种情况:1)、代码中存在if-else分支判断,动态地根据不同类型创..原创 2020-07-26 00:27:33 · 81 阅读 · 0 评论 -
设计模式-创建型-单例模式
为什么要使用单例?单例存在哪些问题?单例与静态类的区别?有何替代的解决方案?单例设计模式:一个类只允许创建一个对象(或者实列),那这个类就是单例类,这种设计模式就叫作单例设计模式,简称单例模式单例的用处从业务概念上,有些数据在系统中只应保存一份,就比较适合设计单例类。除此之外,我们还可以使用单例解决资源访问冲突问题。如何实现单例模式?实现单例模式的关注点如下::构造函数需要private访问权限符修饰,这样才能避免被外部通过new 实列化 需要考虑对象创建的..原创 2020-07-25 12:44:51 · 195 阅读 · 1 评论 -
设计原则--迪米特法则
什么是“高内聚,低耦合”?如何利用迪米特法则来实现“高内聚,低耦合”?有哪些代码设计明显违背了迪米特法则,对此又该如何重构?高内聚、低耦合,在单一职原则中已经介绍过了。这里再复习一下。何为“高内聚,低耦合”?“高内聚,低耦合”是一个非常重要的设计思想,能够有效地提高代码的可读性和可维护性,缩小功能改动导致的代码改动范围。在设计思想中,“高内聚”用来指导类本身的设计,“松耦合”用来指导类与类之间的依赖关系设计。这两者并非独互不相干,高内聚有助于松耦合,松耦合需要高内聚支持。..原创 2020-07-25 10:36:25 · 157 阅读 · 0 评论 -
设计原则--DRY原则
DRY原则,英文名Don't Repeat Yourself 。中文直译:“不要重复自己”。很多人可能会对这条原则会有误解,认为长得一样的两段代码违反了DRY原则。其实不然,重复的代码不一定违反DRY原则,而不重复的代码也可能违反DRY原则。DRY原则三种典型的代码重复情况:实现逻辑重复、功能语义重复和代码执行重复1、实现逻辑重复,但语义不重复,并不违反DRY原则。2、实现逻辑不重复,但语义重复,也算是违反了DRY原则3、如果代码重复执行,那我们也认为它违反了DRY原则注:实现...原创 2020-07-24 06:28:46 · 1333 阅读 · 0 评论 -
设计原则—KISS原则和YAGNI原则
怎么理解kiss原则中的“简单”两字?什么样的代码才算简单?怎样的代码才算复杂?如何才能写出简单代码?YAGNI原则和KISS原则说的是一回事吗?KISS原则的英文版本描述有好几个,如下Keep It Simple and Stupid Keep It Short and Simple Keep It Simple an Straightforward翻译为中文就是:尽量保持简单。代码的可读性和可维护性事衡量代码质量非常重要的两个标准,而KISS原则就是保持代码可读性.原创 2020-07-24 00:22:53 · 544 阅读 · 0 评论 -
设计原则--依赖反转原则
单一职责原则和开闭原则原理比较简单,但实践起来比较困难。但是依赖反转原则正好相反,理解起来比较困难,用起来比较简单。“依赖反转”这个概念指的是“谁跟谁”的“什么依赖”被反转了?“反转”两个字该如何理解 我们还经常听到另外两个概念:“控制反转”和“依赖注入”。这两个概念和“依赖反转”有什么区别和联系 那Spring的IOC跟这些概念又又什么联系1、控制反转控制反转是一个比较笼统的设计思想,并不是一个具体的实现方法,一般指导框架层面的设计,SpringIOC中的“控制”指的是类与类之间依赖关.原创 2020-07-23 22:19:34 · 226 阅读 · 0 评论 -
设计原则--接口隔离原则
接口隔离原则,这个原则最关键就是理解其中“接口”的含义,不同的理解方式,对应的在原则上也有不同的解读方式。除此之外,接口隔离原则和单一职责原则有些类似,需要了解它们的区别和联系接口隔离原则,英文名Iterface Segregation Principle,简称ISP。客户端不应强迫它不需要的接口。这里的客户端可以理解为调用者或者使用者。对于这个原则,最重要的是理解“接口”的含义,这里有三种不同的理解如果把“接口”理解为一组接口的集合,可以是某个微服务的接口,也可以是某个类库的接口等..原创 2020-07-23 15:59:00 · 113 阅读 · 0 评论 -
设计原则--里氏替换原则
哪些代码是违反里氏替换原则的?如何将代码改造成满足里氏替换原则?里氏替换原则和多态的区别?相比其他的设计原则,里氏替换原则还是比较简单,比较容易理解和掌握的。里氏替换原则,英文名Liskov Substitution Principle,缩写LSP。子类对象能够替换程序中父类对象出现的任何地方,并且保证原有程序的逻辑行为不变,及正确性不发生改变。看到这里是不是觉得多态和里氏替换原则有点相似呢?先进一步解读里氏替换原则,然后再区分二者得区别。实际上,里氏替换原则还有一个更加落地,更有.原创 2020-07-23 03:03:07 · 412 阅读 · 0 评论 -
设计原则-开闭原则
怎样的代码改动才能被定义为“扩展”?怎样的代码改动才定义为“修改”?怎样才算满足或者违反开闭原则?修改代码意味着违反开闭原则吗?开闭原则是最难理解,也是最难掌握,同时也是最有用的一条原则。这条原则并不是看几篇文章,理解了其概念就能掌握和灵活应用的。要想深入理解,掌握这条原则,需要大量的实战。开闭原则,英文全称:Open Closed Principle,简称OCP。软件实体(模块、类、方法等)应该“对扩展开放,对修改关闭”。也就是说:添加一个新的功能,在已有代码的基础上扩展代码(新.原创 2020-07-23 00:36:03 · 193 阅读 · 0 评论 -
设计原则--单一职责原则
1、原则的定义2、原则设计的初衷3、能解决哪些问题4、有哪些场景可以使用单一职责原则,英文名Single Responsibility Principle,缩写为SRP。一个类或者模块只负责完成一个职责(或者功能)。也就是说,不要设计大而全的类,要设计粒度小,功能单一的类。换个角度来讲就是,一个类包含两个或者两个以上业务互不相干的功能,那我们就说它职责不够单一,应该将它差分为多个功能单一,粒度更细的类。上面是从类的角度来描述单一职责原则,同样对于一个模块,一个函数亦是如此。..原创 2020-07-22 20:04:34 · 222 阅读 · 0 评论 -
重构--代码重构
这一篇旨在让自己认识重构的重要性,在项目开发过程中要培养自己的重构思维。能在项目迭代过程中,让code review成为开发的一部分,以提高自己的代码能力。什么情况下重构?到底重构什么?又该如何重构?“重构”这个词对于大部分工程师来说可能不陌生,但真正进行代码重构的人不多,而持续重构作为开发的一部分的人少之又少。这是什么原因呢1、重构代码对一个工程师能力的要求,要比单纯写代码高的多。重构需要你能洞察出代码存在的坏味道或者设计上的不足,并且能合理、熟练地利用设计思想、原则、模式..原创 2020-07-21 23:46:42 · 258 阅读 · 0 评论 -
面向对象--接口与抽象类
接口和抽象类是面向编程中的两个重要的概念,你是否完全弄明白了呢?接口和抽象类的区别抽象类有哪些特性?1、抽象类只能被继承,不能被实例化。也就是说不能使用new关键字来实例化一个抽象类2、抽象类可以有属性和方法,其中方法可以实现,可以不实现,不实现的方法被称之为抽象方法,使用abstract关键字修饰3、子类继承抽象类,必须实现抽象方法接口有哪些特性?1、接口中不能包含属性,也就是成员变量2、接口中只能声明方法,方法不能包含实现代码。(使用default和static修饰的方法原创 2020-07-20 05:50:43 · 150 阅读 · 0 评论 -
设计模式--设计模式的知识点梳理
学习设计模式,首先要弄明白我们什么要学习它,其次需要呀弄明白地就是它包含了哪些知识点。设计模式学习地知识点包含5个部分,面向对象、设计原则、设计模式、编码规范以代码重构。面向对象现在,主流的编程范式或者是编程风格有三种,它们分别是面向过程、面向对象和函数式编程。面向对象这种风格又是其中最主流的。现在比较流程的编程语言都是面向对象编程语言,大部分项目也是基于面向对象编程风格开发的。面向对象编程因为具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,很多设计原则,设计模式编码.原创 2020-07-19 21:05:06 · 248 阅读 · 0 评论 -
面向对象--面向对象的相关概念
现在,主流的编程范式或者说编程封风格有三种,它们分别是:面对对象、面向过程、面向函数编程。面向对象这种风格又是其中最主流的。现在大部分编程语言都是面向对象的编程语言,大部分项目也是基于面向对象风格开发的。是因为面向对象编程具有丰富的特性(封装、抽象、继承、多态),是很多复杂的设计思路、设计原则、设计模式编码实现的基础。那什么样的语言是面向编程语言,面向对象编程语言需要有哪些特性呢?那什么样的语言是面向编程语言呢?...原创 2020-07-20 04:11:14 · 177 阅读 · 0 评论