装饰者模式 VS 建造者模式

先列了个架子,还没写完,争取明天写完!!!

1. 什么是设计模式


设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 —— [ 百度百科 ]

简单地讲“设计模式”就是[经验的总结],按照这些经验去办事,可以让你的代码有更好的[重用性],增加[可维护性]
先贤们在码代码的过程中,栽过不少坑,碰过不少头,需求频繁的变更,代码不停的修改。终于有一天,顿悟升仙,悟出了其中的[套路],当然悟出的套路不止一个,总共[23]式,就像武功秘籍有“拳法”、“腿法”,“摔法”等等。设计模式的这23个套路,各有专攻,解决不同场景的问题。

2. 设计模式6大原则


如果再将这23种行,抽象为神,也就是思想,也就有了设计模式的[6]大原则。 这6大原则好比内功心法中的《九阳神功》,乃所有武学精要之所在。能理解多大的深度,它就有多大的威力,如同圣斗士星矢的小宇宙一般,无穷无尽。
记住一点:所有的这些原则都是站在面向对象的基础之上扯出来的,这可能是句废话,但却是是句有用的话。

下面稍微扯一下面向对象和面向过程,以及面向对象的[3]大特征[封装][继承][多态]

我们可以这样简单的理解面向对象和面向过程:
[面向对象]:站在人类的角度看问题,思考问题,解决问题
[面向过程]:站在机器的角度看世界,看人生,看价值
比如我们看到一个小鹿,怎么描述它呢?有腿,有嘴,有尾巴。腿可以跑,嘴可以叫,尾巴可以摇。这就是面向对象的思维,看到一个事物的时候,首先想到的是他有哪些属性,有哪些功能,然后讲这些属性和功能[封装]成一个对象(鹿)。随后我们又看到一头牛,牛同样也有腿,有嘴,有尾巴。思考片刻,又顿悟出一条,对,它们有共性,我们可以先将这种共性用“动物”这个名词表示。不管是鹿还是牛,都具有“动物”的特征(有腿,有嘴,有尾巴。腿可以跑,嘴可以叫,尾巴可以摇。)。它们都[继承]于“动物“,通俗的讲,就是它们都是动物,只不过在编程中,构造了“继承”这个词来表示这种关系。指鹿为牛。。。^^。虽说都属于动物,都会用嘴叫,但叫声还是有差别的。鹿的叫声是。。。;牛的叫声是。。。请各位脑补画面。这就引出了另一个概念[多态]。动物们都会叫,但不同的动物叫声是不一样滴,这就是多态^^。多态又分“重载”和“覆写“。[重载]相当于自己折腾自己,比如鹿叫,被狼追的叫声和追母鹿的叫声,绝对不在一个频道。[覆写]相当于坑爹,当爹的制定了行为准则,当儿子的就不按他爹那一套办。比如老爹定义了”学习“是要看书写字。但到儿子这里“学习”就成了打怪升级。
注意折腾的主体不一样,重载是想着法的让自己的同一个行为,有不同的表现形式,覆写是想着法的让子类的行为和父类的行为不一致,偏重折腾父类,父类已经订好了,你不用,非得自创一派。

机器不管这些,不会将有腿,有嘴,有脚,和能跑,能吃,能攻击封装成一个鹿,它只管这一步做什么,下一步做什么。

装饰者模式 VS 建造者模式_第1张图片

设计原则 简介
单一原则 职责单一
里氏替换 怎么写继承
依赖倒置 面向接口编程
接口隔离 接口精简最小
迪米特 只与直接朋友通信
开闭原则 扩展开放,修改封闭

2.1单一原则


就一个类而言,应该仅有一个引起它变化的原因

简单的讲,就是功能单一
好处:通过减少耦合性、功能分离,可以提高可维护性,易扩展,易复用
例子:毕昇老先生的活字印刷术,每个胶泥块只刻一个字。如果印刷的时候,发现某个字刻错了,只需重新刻这一个字就好,不影响其他的文字。试想,如果将不同的字刻在同一个胶泥块上,若其中一个有错,就需要重新刻录全部的,而且原先已经刻对的,在重刻的过程中,也有被刻错的可能。
装饰者模式 VS 建造者模式_第2张图片

2.2 里氏替换


子类型必须能够替换掉它们的父类型

简单的讲就是父类型引用可以指向类型引用
好处 : 可以使用父类型引用代表一大坨子类型,针对父类型编程,可以提高代码的通用性。
例子: 龙生九子,九个孩子,都可以由龙做代表去谈业务,谈合作。
装饰者模式 VS 建造者模式_第3张图片

2.3 依赖倒置


i>高层次模块不应该依赖底层次模块,两个都应该依赖抽象
ii>抽象不应该依赖细节,细节应该依赖抽象

简单的讲就是面向接口编程,细节是多变的,现对于细节,抽象出来的东西要稳定许多。
例子: 电脑的USB接口,不同品牌电脑的USB接口,可以插不同品牌的U盘。大家在生产电脑和U盘前,先将USB接口定义好,电脑厂商按照指定的USB接口集成USB,U盘厂商按照指定的接口生产U盘,那么之后,不管是电脑更新升级换牌子,也不管U盘更新迭代换牌子,都可以插入电脑正常使用。
装饰者模式 VS 建造者模式_第4张图片

2.4 接口隔离


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

简单的讲就是接口精简最小,比如一个类实现一个接口,接口有10个方法,但实际只需要实现其中的2个方法,另外的8个方法根本不需要。但按照语法还得增加这8个方法的实现,这就很不合适。遇到这种情况,可以讲接口拆分成更小的功能模块。

2.5 迪米特


如果两个类不必彼此直接通信,那么这两个类就不应该发生直接的相互作用。如果其中一个类要调用另一个类的某一个方法的话,可以通过第三者转发这个调用

简单的讲就是只与直接朋友通信,哪些是直接的朋友呢?成员变量、方法参数、方法返回值中的类,而出现在局部变量中的类则不是直接的朋友。这样做是为了降低耦合,实现高内聚。
例子: 比如你是做网管软件的,遇到了设备问题,需要设备的人看下,最好的办法,是找设备的老大,说明问题,让他去协调人力去解决,而不是自己去找下面的人来回扯来回推,因为这事让谁做,不让谁做,谁有时间做,你是协调不来的,也很容易遇到其他问题。将这些细节,交给第三者(设备老大)去做,不与设备开发人员直接联系。

2.6 开闭原则


软件实体(类、模块、函数等等)应该可以扩展,但不可以修改

简单的讲就是对修改封闭,对扩展开放
这个测试最有感触,刚对这个模块功能测试完,结果开发又改了代码,所有的测试都得再跑一边。但如果只是扩展新功能,只需要增量测试即可。

闭上眼睛,仔细的想一下,你会发现,上面讲的5种原则也都遵循了开闭原则。

装饰者模式


装饰者模式

dsfsd
装饰者模式 VS 建造者模式_第5张图片

使用场景

UML

代码实例

代码块语法遵循标准markdown代码,例如:

@requires_authorization
def somefunc(param1='', param2=0):
    '''A docstring'''
    if param1 > param2: # interesting
        print 'Greater'
    return (param2 - param1 + 1) or None
class SomeClass:
    pass
>>> message = '''interpreter
... prompt'''

建造者模式


建造者模式

qqq
装饰者模式 VS 建造者模式_第6张图片

使用场景

UML

代码实例


二者区别

二者区别

博客文章会同步到微信订阅号“Java技术博文”,有兴趣的小伙伴可以关注,每周会同步更新一次博客。
装饰者模式 VS 建造者模式_第7张图片

你可能感兴趣的:(设计模式)