在学习设计模式之后, 我终于有点理解什么叫面向对象的编程了.
把那天网上抄过来来的定义再试着回忆一下. 从历史原因角度上来看,刚开始的编程是面向过程的编程, 但会导致逻辑结构复杂,代码晦涩难懂, 人们希望模拟现实世界,以人们常用的思维逻辑去设计应用程序, 出于这种设计的愿望之下,诞生了面向对象的编程.
什么是面向对象编程? 把解决问题相关的各个事物,都分解成一个个的对象. 对象不是用来完成某个步骤的,而是用来描述事物解决问题时的步骤和状态? 对象作为程序的基本单位,封装函数和数据在其中.
第二段的内容很明显有点抽象,没有一个具体的东西来配合解读, 我觉得很难完全得到理解.
然后通过策略模式,抽象工厂模式,装饰者模式,以及观察者模式,的初步学习, 有一点小小理解. 首先我们需要整理一下,所学的知识. 以上几个模式,不难发现,他们都有一些相似的结构, 之前的笔记当中也有提过, 第一层结构是,有个构造函数,有个原型,还能返回一个实例对象. 然后在原型上会一个数组, 比如 this.strategies = {},这里会放置一系列的方法和函数. 所谓的开闭原则,对修改关闭通畅应该是指函数,不要更改已经写的函数代码. 而对扩展开放,应该是指对象,因为对象的结构,可以很自然的添加属性和方法,也可以留出接口. 这也是面向对象编程, 也就是为什么程序的基本单位是对象的思想.因为容易实现上面的思维.
然后在实例上定义一个 this.cache=[],这里会放置要执行的函数, 在原型上有extend的方法,用来针对strategies进行扩展,也就是定义更多的核心函数, 还有add方法,用来针对cache,存放待执行的函数.
会有一个start方法用来执行 add里的所有函数. 然后还可以有remove() empty() 方法来针对 cache 进行清空和删除操作.
所以基本套路就是上面这种. 上面的这种基本结构当中,有隐含的东西, strategies 和 cache strategies相当于是数据库用来存放数据(函数)的感觉很强烈. 而cache则更多的面向执行?程序在运行的时候,大多数都是针对这里进行操作?
不过相比较其他模式,策略模式的cache和add配合我觉得很厉害的感觉, 严格来讲,他是把对应的函数和参数’配’到一起,然后形成新的函数(用function(){do()}的形式) 放进了add里.没有立即执行,而是放进add里有继续被操作的机会.
还有就是,如果细心一点就会发现, 这些个模式的基本结构中, (咦?在观察者模式中起的什么名字来着?triggle?) 都会传入一个type参数, 如果细思量就会发现,这个参数跟函数的功能实现,可能没多大关系, 主要的作用实际上是,用来寻找对应的函数
我存粹是跟着感觉在写东西,通过这种方式,把脑海中的感觉清晰化, 虽然整个文章逻辑不清,甚至我自己都可能不想看第二回, (这绝对不是个好习惯,该文章也绝对不是个好产品..) 但这个过程本身加深了我自己的理解.
而这几节设计模式课,给我的一个挺大的感觉是, 代码的执行,实际上是函数和参数互相之间的搭配? 或者设计成了这样.
此前我学习js的时候,陷入过一个思考, 是函数找数据? 还是数据找函数? 比如说我要实现一个需求, 我先按照大的思路,定义一个函数, 然后分解成多个小”需求” 最后连接上数据,实现需求. 但实际上由于经验上的不足,我很难实现.
第二种则是, 我从数据的角度去考虑整个线索, 比如我要实现这个需求, 那我都需要哪些数据? 这些数据从何而来,一步步寻找源头, 这个过程当中,去定义,需要定义哪种函数, 这样写是有好处的, 好处就是,思路不容易断, 基本上功能都能写出来. 在这个过程当中,我就感觉应该是数据寻找函数,这个思路才是对的. 坏处就是,写完可能会比较乱. 尽管在这个过程当中, 当我遇到感觉有”重复”有”冗余”的时候, 会想办法根据单一职责的原则,封装成一个个的函数,保持复用. 从某种角度上也确实有效果, 但往往就是这些”游离”的函数会比较多, 最后需要重新调整结构, 可能这就是人们口中的”重构”? 当然由于比较懒,这个练习过程可能也比较少(实现完功能,,基本就歇菜了.)
但是学完这几节设计模式, 感觉,这种面向对象的编程以及配合这种设计模式, 最大的好处是更够有效的进行组织? 不只是组织数据,而且还组织函数. 真的是通过以对象为单位,能够比较容易的完成一个复用性和扩展性以及维护性.
那么问题就变成了,谁和谁组织在一起? 怎么组织在一起? 如何定义一个对象? 如何定义一个关系? 如何识别关系?
回过头来看设计模式, 我们开头抽出来的是某种基本结构,一种对象的基本结构. 而各种不同的设计模式,像策略模式,抽象工厂模式,观察者模式,装饰者模式, 这些模式的不同有可能回答的就是如何定义关系? 我记得开篇有个ppt,找一下.

我们试着分析一下.都有哪种关系? 有些属性和函数(行为)是一个对象(模块)从一开始就需要有的, 这种的就需要用工厂模式, 假设通过传入不同的参数,我们可以让不同的实例拥有不同的属性值, 但实例和实例之间如果需要设置不同的属性, 又有很多相同的属性和行为, 那我们就可以考虑用抽象工厂模式?
如果一个对象在运行过程当中,要增添属性或行为, 就可以考虑用装饰者模式?
百度s设计模式 第一个文章
【原】常用的javascript设计模式
多一个角度去学习.