设计模式快速学习(一)

UML类图

简单工厂模式

1.1类图

策略模式

2.1策略模式结构图

2.2策略模式解析

策略模式时一种定义一系列算法的方法,从概念上看,所有这些算法完成的算法都是相同的工作,只是实现不同,他们可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

策略模式的Strategy类层次为Context定义了一些列可供重用的算法或行为。继承有助于吸取出这些算法中的公共功能。

策略模式的有点时简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。

当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择合适的行为。将这些行为封装在一个个单独的Strategy类中,可以在使用这些行为的类中消除条件语句。

策略模式是哟过来封装算法的,但是在时间中,我们发现可以用它来封装几乎任何的类型规则,只要在分析过程中挺好需要在不同时间应用不同的业务规则,就可以考虑策略模式处理这种变化的可能性。

单一职责原则

3.1What?

单一职责原则就是一个类而言,应该仅有一个引起它变化的原因。

3.2why?

如果一个类承担的职责过多,就等于把这些职责耦合在一个,一个职责的变化可能会消弱或者抑制这个类完成其他的职责的能力。这种欧冠耦合会导致脆弱的设计,当变化发生时,设计就会遭受到意想不到的破坏。

软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。如果你能够想到多于一个动机去改变一个类,那么这个类就多余一个的职责。

开放封闭原则

4.1what?

开放-封闭原则,就是说软件实体(类、模块、函数等等)应该是可以扩展,但是不可以修改的。

4.2why?

这个原则其实就是两个特征,一个是说“对于亏咱是开放的”,另一个是说“对于更改是封闭的”。

怎样的设计才能面对需求的改变却可以保持相对稳定,从而使得系统可以在一个版本后保持不断推出新的版本呢?开放-封闭原则给了我们答案。

无论模块是多么“封闭”,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最可能发生的变化种类,然后构造抽象对象来隔离他们的变化。

面对需求,对程序的改动是通过增加代码进行的,而不是改动现有的代码。

开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该对程序中呈现出频繁变化的那写部分做出抽象,然而,对应用程序中的每个部分都刻意地进行抽象也不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。

依赖倒转原则

5.1what?

依赖倒转原则:

A. 高层模块不应依赖底层模块。这两个都应该依赖抽象。

B. 抽象以应该依赖细节。细节应该依赖抽象。

5.2why?

针对接口编程,不要对实现编程。

依赖倒转其实可以说是面向对象设计的标志,用那种语言来编程并不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有依赖都终止于抽象类或者接口,那就是面向对象的设计,反之就是过程化的设计了。

里氏替换原则

5.1what?

里氏替换原则:子类必须能替换掉他们的父类。

5.2why?

一个软件尸体如果使用的是一个父类的话,那么一定适用于其之类。二且它察觉不出父类对象和子类对象的区别。

也就是说,在软甲那里面,父类都替换成它子类,程序的行为没有变化。

只有当子类可以替换掉父类,软件的单位功能不受影响时,父类才能真正被服用,二子类也能在父类的基础上增加新的行为。

装饰模式

6.1装饰模式结构图

6.2装饰模式解析

装饰模式:动态地给一个对象填加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

装饰模式是为已有功能动态地添加更多更能的一种方式。当系统需要新的功能的时候,时向就的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或者主要行为。在主要中家兔新的字段,新的方法和新的逻辑。从而增加了主类的复杂度。而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的类中,并让这个类包装他所需要装饰的对象,因此,当需要执行特殊的行为时,客户代码就可以运行时根据需要有选择地,按顺序地使用装饰功能包装对象了。

把类中装饰功能从类中搬移出去,这样就可以简化原有的类。有效地把核心职责和装饰功能区分开了而且可以去除相关类中重复的装饰逻辑。

代理模式

7.1代理模式结构图

7.2代理模式解析

远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以吟唱一个对下个存在于不同地址空间的事实。

虚拟代理,是根据需要创建开销很大的对象。通过它来存放实力化需要很长时间的真实对象。

安全代理,使用控制真是的访问对象访问时的权限。智能指引,时值当调用真实的对象时,代理处理另外一些事情。

工厂方法模式

8.1工厂方法模式结构图

8.2工厂方法解析

工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑转移到了客户端代码来进行。你想要加功能,本来时要该工厂的,现在需要修改客户端。

参考文献:

大话设计模式

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据和云计算技术

算法系列 图数据结构探索(无向图搜索)

算法是基础,小蓝同学准备些总结一系列算法分享给大家,这是第10篇《无向图搜索》,非常赞!希望对大家有帮助,大家会喜欢!

2014
来自专栏java学习

java成员变量和局部变量

最新通知 ●回复"每日一练"获取以前的题目! ●【新】Android视频更新了!(回复【安卓视频】获取下载链接) ●【新】Ajax知识点视频更新了!(回复【学习...

29412
来自专栏思考的代码世界

Python网络数据采集之数据清洗|第06天

1323
来自专栏撸码那些事

【抽象那些事】命令式抽象

1313
来自专栏撸码那些事

【抽象那些事】 命令式抽象

这种坏味是由操作转换为类引起的,表现为类中只定义了一个方法,有时候类名和方法名相同。这种坏味还常常表现为方法操作的数据位于另一个类中。

3618
来自专栏企鹅号快讯

Python从零基础到精通!小白也能学会!

引言 Functional Programming(函数式编程)的概念最早起源于LISP,由约翰·麦卡锡在1958年创立,最早提出了自动垃圾回收的理念,这一理念...

1935
来自专栏腾讯移动品质中心TMQ的专栏

小说书架内容质量自动化测试

一.项目背景 小说书架的产品思路是:在手机QQ浏览器这个平台上,给用户提供一个小说书架这样的小说阅读入口。通过这个入口阅读到的小说,是后台将从其它网页中抽取到...

2225
来自专栏C语言及其他语言

[每日一题]C语言程序设计教程(第三版)课后习题5.6

题目描述 给出一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。 90分以上为A 80-89分为B 70-79分为C 60-69分为D 60...

3135
来自专栏tkokof 的技术,小趣及杂念

Coroutine,你究竟干了什么?

  使用Unity已经有一段时间了,对于Component、GameObject之类的概念也算是有所了解,而脚本方面从一开始就选定了C#,目前来看还是挺明智的:...

481
来自专栏我杨某人的青春满是悔恨

人生充满选择,编程也是

人生在世,我们每天都需要进行三项重大选择:早餐吃什么,午餐吃什么,晚餐吃什么。这一度让我感到非常为难,于是我养成了一个习惯,只要在附近的餐馆发现了几种还不错的食...

901

扫码关注云+社区