1、设计模式是什么?
先用比喻来回答:
假如面向对象是兵器,那么,设计模式是一套武术套路,是一本编程人员均需要的葵花宝典。
假如面向对象是一个算盘,那么,设计模式就如同是珠算口诀。学珠算是要记口诀的。但会打算盘的是不用口诀的。并不是不用,而是在用时,己没有文字或模式的具体概念干扰了。
假如面向对象是五笔字型,那么,设计模式,就是五笔字型的口诀。但会打字的,则是想字读码,或看字读码,已不再需要口诀了。
学习设计模式,成为一个PHP核心代码编写高手,需要的就象前述的那种境界。
要达到这样的境界,是要明白,看设计模式示例代码,最终目标是能让自己遇到问题时立刻能够给出类与类之间的结构设计,而不是找出设计模式参考,看哪个模式适合。如同学五笔时记口诀的目标是看字读码或想字读码。而不是每次用口诀去对。
那么,学习设计模式,就需要有确当的方法。
2、再问设计模式是什么?
用设计模式的作用来回答:
设计模式是用来组织应用的结构的。使用设计模式,能够使你的应用拥有一个清析的,可维护,可扩展,松耦合的应用架构。、
对于一个应用,特别是大型的WEB应用,我们希望它有一个清析的架构。
为了实现这一点,首先我们要做的是:要把核心代码与非核心代码分开。
那么,什么是核心代码?什么是非核心代码呢?
而核心代码则是,大家都需要用到的,在应用中会有很多地方调用的,不涉及具体问题的代码。
非核心代码则与具体问题有关。
当我们要把要把核心代码与非核心代码分开时,会遇到以下两种情况:
第一、是由具体的部分调用核心的。这种情况下,就需要把核心代码封装成具体代码可以方便调用的类即可。
第二,是则核心的部分调用非核心的。这种情况是比较复杂的。因为非核心部涉及具体的问题,会因不同的具体问题而变化。这种情况相对复杂。PHP5,作为完全面向对象的语言,提供了面向对象中针对这一方面需求有的所有的功能。
这些功能包括:抽象方法,抽象类,最终方法,最终类,接口。这些功能的基本用途如下:
接口:如果核心代码需要调用一个具体的类,这时,我们可以把这个具体的类先定义为接口,这就是说,一个只有接口名(相当于类名)和所有未实现具体代码的函数(方法)构成的一个结构。这样做的目的,是要告诉那些所有实现具体代码的人,这个类该怎样做,核心代码才能正确调用。
抽象类:假如,接口中存在已实现的方法代码,那么,就不能再用接口进行定义,而是要用抽象类,将没有具体实现的方法定义类抽象方法。
最终方法:如果某一个方法在抽象类中实现后,不可以在子类中重写,则需定义为最终方法。
最终类,哪果某一个类,不允许被继承,则此类可定义为最终类保护起来。
由此可见,抽象方法,抽象类,最终方法,最终类,接口这些功能,目的是让你核心代码调用具体代码时,为具体代码实现一个约定,保证具体代码实现时遵守这个约定,从而保证核心代码能调用成功。
设计模式,实际上基本都是针对核心代码调用具体代码的场景的。
理解了这一点,那么,学会并真正领悟设计模式就相当简单多了。
我们根据这一点,就能从设计模式的例子代码中搜索线索:
这一模式中定义了哪些接口与抽象类?
这一模式中的核心代码调用具体代码的调用关系是什么?然后,你不再需要记住这些代码是如何实现的。而是遇到具体问题时,你能够不用考滤就自然用上了某一模式了。
3、三问设计模式是什么?
其实上面的回答已差不多了。
设计模式,是针对核心代码调用具体代码的场景,对其进行总结归纳,在此基础上得出的一套实用的编程套路。并且,这些套路,是以一些基本的架构原则前提,保证架构的清析的,可维护,可扩展,松耦合。这一些基本原则,现在被简称为SOLID原则。(这是因为,这五个原则的第一个字母组合起来,正好是SOLID这个单词)。
SOLID原则是指:
SRP:The Single Responsibility Principle 单一责任原则 功能多少
OCP:The Open Closed Principle 开放封闭原则 应对变化
LSP: The Liskov Substitution Principle 里氏替换原则 分类明确
ISP: The Interface Segregation Principle 接口分离原则 方便组合
DIP: The Dependency Inversion Principle 依赖倒置原则 面向对象的功能
以上首字母简写,即是SOLID
实际上,面向对象的原则中,还有:
CARP: The Composite/Aggregate Reuse Principle 合成聚合复用原则
LoD: The Law of Demeter 迪米特法则
IoC: The Inversion of Conntrol 控制倒置原则
因为,这些都是面向对象应用必须遵循的基本原则,所以,要真正学会设计模式,必须要先弄懂它们。以下进行分述。
(待续)