大话设计模式 读书笔记(一)之 设计模式

大话设计模式

标签(空格分隔): 设计模式 大话 设计

仅供参考 /(ㄒoㄒ)/~~


相关的对应的代码会贴上百度云,是用JAVA写的。想看的可以下载(在文章末尾)。暂时只是一些个概念和大体结构,大部分(jihu)是没有代码的,理解起来肯定会比较难(或许根本理解不了),whatever ,只是个人读书笔记,比较粗糙,凑活看吧。哈哈。

一 、简单工厂模式

用一个单独的类来实现易修改和扩展创造实例的过程。
有图

file

  • UML类图图示样例

file

'+'表示public
'-'表示private
'#'表示protected

  • 继承关系用空心三角形+实线来表示
    如图

    file

  • 接口关系用空心三角形+虚线表示
    形如上图(略)

  • 关联关系用实线箭头表示
    形如上图(略)、

  • 聚合关系

聚合表示一种弱的’拥有‘关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分 --《设计模式》第二版
用空心的菱形+实线箭头表示

这个有图哦:happy:

file

  • 组合关系

一种强的'拥有'关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样 --《设计模式》

组合关系用实心的菱形+实线箭头来表示,连线两端的数字1,2,被称为基数表明这一端的类可以有几个实例(n表示无数)。
这个也是有图的 看图

file

  • 依赖关系
    用虚线箭头表示
    UML最后一张图

    file

二 、策略模式

定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。[DP]

面向对象的编程,并不是越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类

策略模式结构图

file

策略模式反思
策略模式是定义一系列算法的方法,从概念上来讲,所有这些算法完成的都是相同的工作,只是实现不同,他可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合 --《设计模式》[DPE]

  • 策略模式的另一个优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试 --《设计模式》【DPE】

1. 单一职责原则(SRP)

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

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

2. 开放-封闭原则[简称OCP]

是说软件实体(类,模块,函数等等),应该可以扩展,但是不可修改【ASD】

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

3. 依赖倒转原则

抽象不应该依赖细节,细节应该依赖于抽象。(针对接口编程,不要对实现编程)

依赖倒转原则

  1. 高层模块不应该依赖底层模块,两个都应该依赖抽象。
  2. 抽象不应该依赖细节,细节应该依赖抽象。【ASD】

4. 里氏代换原则【LSP】

子类型必须能够替换掉他们的父类型。【ASD】

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

file

(依赖倒转其实就是谁也不依赖谁,除了约定的接口,大家都可以灵活自如)

原则总结

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

三 、装饰模式

动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活【DP】

如图装饰模式结构图

file

装饰模式实例代码(感觉穿衣服的例子比较有意思,是java代码:sad:,逻辑能看懂:sad:)

后面有例子总结,不想看图的直接跳到后面看。

file

file

file

file

file

小结

我理解的大概的过程是这样一个工程。就是先从最后的具体服饰类开始往上逐个装饰的走。从具体服饰类到服饰类再到Person类。(可以从结果显示中看到这一过程)。

  • 总结

    装饰模式是为已有功能动态地添加更多功能的一种方式,装饰模式提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有条件地,按顺序地使用装饰功能包装对象了【DP】

(优点:把类中的装饰功能从类中搬除去除,这样可以简化原有的类。这样做的更大的好处是有效的把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑。)

四 、代理模式(Proxy)

为其他对象提供一种代理以控制对这个对象的访问。【DP】

代理模式结构图

file

注释

大概的意思就是,有一个公共的接口。中间代理和实际实体两者都实现接口的方法。当具体操作的时候,用代理操作,在代理内部实现实际方法的实例化操作来间接的替代实际方法。

  • 应用场合

    1. 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实[DP]。
    2. 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象[DP]。这样就可以达到性能的最优化,比如打开一个很大的HTML页面,虽然有很多图片但是还是能很快的打开它,此时看到的是文字,图片是一张一张的下载后才能看到。那些未打开的图片框,就是通过虚拟代理来替代了真实的图片,此时代理存储了真实图片的路径和尺寸。其实,浏览器当中是用代理模式来优化下载的。
    3. 安全代理,用来控制真实对象访问时的权限[DP]。一般用于对象应该有不同的访问权限的时候。
    4. 智能指引,是指当调用真实的对象时,代理处理另外一些事情[DP]。如计算真实对象的引用次数,当该对象没有引用时,可以自动释放它:或当第一次引用一个持久对象时,将它装入内存:或在访问一个实际对象前,检查是否已经锁定它,以确保其他对象不能改变它。它们都是通过代理在访问一个对象时附加一些内务处理。

    代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。

五 、工厂方法模式

简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

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

file

工厂方法模式具体实现示例图

file

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

六 、原型模式

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象[DP].

原型模式结构图

file

注释 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。

原型模式中一般在初始化的信息不发生变化的情况下,克隆时最好的办法。这即隐藏了对象创建的细节,又对性能是大大的提高。同样也不用重新初始化对象,而是动态地获得对象运行时的状态。

  • ‘浅复制’:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
  • ‘深复制’:深复制把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

声明:这一模式,本人看的不是太懂。感觉有些东西不通。下面会有一个详细的例子,可以参考一下。不解释。

简历的深复制实现

file

file

file

七 、模板方法模式

当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板模式方法处理。

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

file

  • 模板方法模式特点
    • 模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现其优势。
    • 提供了一个很好的代码复用平台
    • 当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。

八、迪米特法则

迪米特法则(LoD)/最少知识原则[J&DP]:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。[J&DP]

九 、外观模式

外观模式(Facade):为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用[DP]

file

十 、 建造者模式

建造者模式(Builder):将一个复杂对象的建造与它的表示分离,使得同样的建造过程可以创建不同的表示[DP]

建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。

file

  • 建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时适用的模式。

十一 、观察者模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己[DP]。

file

观察者模式特点

  • 当一个对象的改变需要同时改变其他对象时而且它并不知道具体有多少对象有待改变时,应该考虑使用观察中模式。

  • 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,这时用观察者模式可以将两者封装在独立的对象中使他们各自独立的改变和复用。

    委托[这段有点突兀,我理解的大概意思是把观察者也抽象了,直接委托具体的类去实现观察类的抽象。]

    委托就是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托可以看作是对函数的抽象,是函数的‘类’,委托的实例将代表一个具体的函数。

十二、抽象工厂模式

抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。[DP]

file

[相关代码](链接:http://pan.baidu.com/s/1hrCya6S 密码:ye5x)

本作品采用《CC 协议》,转载必须注明作者和本文链接
一个小虫子
本帖由系统于 6年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!