Head First设计模式学习总结

Head First设计模式学习总结

  • 概念
    • OO(object-oriented)
      • OOA(object-oriented-analysis)
      • OOD(object-oriented-design)
      • OOP(object-oriented-Programming)
  • 设计模式
    • 1、策略模式
        • 鸭子问题?
        • 设计原则
        • 正式定义
    • 2、观察者模式
        • 设计原则
        • 气象站问题?
        • 总结


(声明:本教程仅供本人学习使用,如有人使用该技术触犯法律与本人无关)
(如果有错误,还希望指出。共同进步)



概念

OO(object-oriented)

​ 面向对象是在结构化设计方法出现很多问题的情况下应运而生的。

​ 结构化设计方法求解问题的基本策略是从功能的角度审视问题域。它将应用程序看成实现某些特定任务的功能模块,其中子过程是实现某项具体操作的底层功能模块。在每个功能模块中,用数据结构描述待处理数据的组织形式,用算法描述具体的操作过程。

​ 对象的含义是指具体的某一个事物,即在现实生活中能够看得见摸得着的事物。在面向对象程序设计中,对象所指的是计算机系统中的某一个成分。在面向对象程序设计中,对象包含两个含义,其中一个是数据,另外一个是动作。对象则是数据和动作的结合体。对象不仅能够进行操作,同时还能够及时记录下操作结果。


封装

​ 通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口


继承

​ 指可以让某个类型的对象获得另一个类型的对象的属性的方法,他的能力是可以使用现有类的所有功能,并且在无需重新编写原来类的情况下对这些功能进行扩展。通过继承创建的类叫做:子类或者派生类,被继承的类:基类,父类或者超类。


多态

​ 其实就是一个类的实例的相同方法在不同的情形下由不同的表现形式。

​ 具体点说就是不同类对公共接口有不同的实现方式,单这些操作可以通过相同的方式(公共接口)予以调用。比如说:同一个接口,不同的类去实现(继承),但是每个子类重写了他的方法,这样一来,这个接口的方法在子类中的实现方式各不相同。但是方法名相同。 父类引用指向子类对象


OOA(object-oriented-analysis)

​ 面向对象分析方法,是确定需求或者业务的角度,按照面向对象的思想来分析业务。

​ 1、确定对象和类。这里所说的对象是对数据及其处理方式的抽象,它反映了系统保存和处理现实世界中某些事物的信息的能力。类是多个对象的共同属性和方法集合的描述,它包括如何在一个类中建立一个新对象的描述。

​ 2、确定结构(structure)。结构是指问题域的复杂性和连接关系。类成员结构反映了泛化-特化关系,整体-部分结构反映整体和局部之间的关系。

​ 3、确定主题(subject)。主题是指事物的总体概貌和总体分析模型。

​ 4、确定属性(attribute)。属性就是数据元素,可用来描述对象或分类结构的实例,可在图中给出,并在对象的存储中指定。

​ 5、确定方法(method)。方法是在收到消息后必须进行的一些处理方法:方法要在图中定义,并在对象的存储中指定。对于每个对象和结构来说,那些用来增加、修改、删除和选择一个方法本身都是隐含的(虽然它们是要在对象的存储中定义的,但并不在图上给出),而有些则是显示的。


OOD(object-oriented-design)

​ 面向对象设计方法是OO方法中一个中间过渡环节。其主要作用是对OOA分析的结果作进一步的规范化整理,以便能够被OOP直接接受。


OOP(object-oriented-Programming)

​ 面向对象程序设计作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。


设计模式

1、策略模式

鸭子问题?

问题:扩展模拟鸭子游戏-------基于标准的OO技术-------会飞的鸭子!!

解决方案 效果
在超类Duck中新建一个方法fly() 橡皮鸭子会飞,木头鸭同时也不会叫
使用继承将fly()方法重写 代码在多个子类中重复
很难知道所有鸭子的全部行为
运行时的行为不容易改变
改变会牵一发动全身,造成其它鸭子代码的改变

设计原则

​ 1、找出应用中可能需要变化的第一个设计原则,把他们独立出来,不要那些不需要变化的代码混在一起。(适用于经常性的修改某个行为,必须在每一个定义它的类中修改它)

【让系统中的某部分改变不会影响其他部分】

​ 2、针对接口编程(针对超类型编程),而不是针对实现编程

【实现:新建针对飞行、发声行为的两种相互独立的类;当新生成一种鸭子类的时候,鸭子中的飞行和发声行为继承行
为类,这样特殊的鸭子在自身定义的时候需要改写这两种行为,而不是说去修改这两种行为本身,这样就能让其它的鸭
子或者拥有该种行为的类去复用】
【自己的理解】:
利用了OOD中的多态。编程时针对超类型(父类)进行编程,也就是说变量的声明类型(或方法的返回类型)是超类型,
而不是具体的某个子类。超类型中的各个方法的具体实现不在超类型中,而是在各个子类中。这样在程序执行时可以根据
实际状况执行到真正的(某个子类)行为。这样带来的好处是,我们在声明一个变量时无需关心以后执行时的真正的数据
类型是哪种(某个子类类型),这是种解耦合(松耦合)的思想。我们之后维护的时候可以随时将声明的变量替换为真正
需要要执行的类型,具有很高的可维护性和可扩展性。所以其实我们还可以换个说法:“针对超类型程”,超类型则通常是接
口或是一个抽象类。

​ 3、多用组合,少用继承

【鸭子的行为是将两个或以上的类进行组合起来,使得建立起来的系统具有很大的弹性,不仅可以将算法封装成类,更可以动态的改变行为,前提是组合的行为对象符合正确的接口标准】

正式定义

​	策略模式定义了算法类,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

2、观察者模式

​ 观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖着都会收到通知并自动更新。

如何解释一对多:

​ 利用观察者模式、主题是具有状态的对象,并且可以控制这些状态。也就是说,是“一个”具有状态的主题。另一方面,观察者使用这些状态,虽然这些状态并不属于他们。有许多的观察者,依赖主题来告诉他们状态何时改变了,这就产生了一个关系:“一个”主题对"多个"观察者的关系。(比如ORM中的一对多关系?)

依赖关系

​ “主题”是真正去更新数据的人,观察者是主题的依赖者,主题自己更新数据远比所有依赖者更新主题数据更简单,同时可以得到更干净的OO设计。

软件设计原则高内聚、低耦合

观察者的松耦合

​ 1、任何时候你都可以增加新的观察者,任何时候你都可以删掉这些观察者

​ 2、新类型的观察者出现时,不用兼顾其它的观察者修改主题的代码,只需要在新类型的观察者中实现成为观察者的方法。

​ 3、可以独立的复用主题或者观察者

设计原则

​ 1、为了交互对象之间的松耦合设计而努力。

松耦合的设计之所以能让我们建立有弹性的OO系统,能够应对变化,是因为对象之间的互相依赖降到了最低。

气象站问题?

角色 方法 功能
气象站 主题 ArrayList()
add()
update()
remove()
存放所有观察者的地方
注册成该主题的观察者
通知(更新数据)观察者
注销该主题的观察者
布告板 观察者 update()
display()
用于主题更新观察者数据的方法
观察者本身的方法,用于展示

总结

Head First设计模式学习总结_第1张图片

你可能感兴趣的:(笔记,python)