写在本系列最前面:
在以前的印象中,设计模式似乎是一个非常高大上的东东,但是呢,要想从一个码农进阶到一个工程师,怎么能绕过这东西呢。无奈,找各种设计模式的书来看,得益于自己学习过多种语言的经验,先后学习了java,php,javascript里的设计模式后,总算对设计模式有了一知半解的了解,于是乎,想着将自己理解的东西记录一下,以便后用(健忘症必备技能)。
为什么学习设计模式
1、设计可复用的面向对象的应用;(按套路出牌不会吃亏)
2、提高编程效率,减少重复编码;(不是复制粘贴)
3、帮助编程者快速确定系统的解决方案;(复用或稍微修改下以前的方案)
4、帮助构建模块化系统,降低模块之间耦合度;(牵一发不用动全身)
关于设计模式本身
模式名称:能够形象的表示该模式的核心功能或效果
问题:该模式能够解决哪些问题
解决方案:该模式具体的工作原理与方式
效果:使用该模式设计之后较不使用该模式有什么明显的提升效果;
以后学习每一种模式也都针对这四点去吃透它!
更多的准备工作
1、模式依据目的可分为:
创建型:与对象的创建有关,基本模式为工厂方法模式;
结构型:处理类或对象的组合,基本模式为代理模式;
行为型:对类或对象怎样交互和怎样分配职责进行描述,基本模式为注册模式;
2、依据作用范围,分为类模式和对象模式。类模式处理类和子类之间的关系,编译时已经确定;对象模式处理对象间的关系,更具动态性
3、客户请求是使对象执行操作的唯一方法,操作又是对象改变内部数据的唯一方法;
4、严格反映当前现实世界的模型并不能产生也能反映将来世界的系统——所以我们需要更高层次的抽象类。
5、所谓对象的粒度指的是对象的大小和数目上的度量结果。
6、发送给对象的请求和它的相应操作在运行时刻的连接就称之为动态绑定
7、动态绑定允许你在运行时刻彼此替换有相同接口的对象,这种可替换性称为多态
8、对象的实现由类决定,类指定了对象的内部数据和表示,也定义了对象所能完成的操作。对象通过类的实例化来创建。
9、新的类可通过继承已存在的类来定义(注意,对象是创建,而类是定义!!),子类继承父类时包含了父类定义的所有数据和操作。子类的实例对象包含所有子类和父类定义的数据,且他们能完成子类和父类定义的所有操作。
10、抽象类的目的是:为它的子类定义公共接口。抽象类将它的//部分或全部//(注意,这里可以是部分,意味着抽象类可以在自身中实现部分操作)操作的实现延迟到子类中(这些操作就不用再抽象类自身中去实现,就是写一个空方法)。
11、抽象类不能被实例化!!!
12、在抽象类中定义却没有实现的操作被称为抽象操作。
13、混入类(mixin)是给其他类提供可选择的接口或功能的类,它不能被实例化,并且要求多继承。
14、针对接口编程,而不是针对实现编程。
不将变量声明为某个特定的具体类的实例对象,而是让它遵从抽象类所定义的接口。
15、面向对象系统中功能复用的两种最常用的技术是类继承和对象组合。
16、类继承可以比较方便地改变被复用的实现,但它无法再运行时改变继承自父类的实现,而且破坏了封装性,因为父类对子类暴漏了细节,并且父类的改变必然引起子类的变化,增加了耦合。
17、对象组合是通过获得对其他对象的引用而在运行时刻动态定义的。由于“黑箱复用”的特性,对象彼此间通过接口引用,并不破坏封装性,而且,它能减少类继承的规模。
18、优先使用对象组合,而不是类继承。
理想情况下,你不应为获得复用而去创建新的构件,因为使用对象组合技术可以获得你需要的功能。
19、委托是一种组合方法,它使组合具有与继承同样的复用能力。接受请求的对象将操作委托给它的代理者(类似于子类将请求交给它的父类处理)。委托方式为了使被委托的操作可以引用接受请求的对象,将自己传给委托者(相当于this引用)。
20、委托的主要优点在于它便于运行时刻组合对象操作以及改变这些操作的组合方式。
21、参数化类型给我们提供了除了类继承和对象组合外的第三种方法来组合面向对象系统中的行为。
22、聚合意味着一个对象拥有另一个对象或对另一个对象负责,聚合对象和其所有者具有相同声明周期。
23、相识意味着一个对象仅仅知道另一个对象。(关联、引用),相识的对象可能请求彼此的操作,但是它们不为对方负责。
24、从根本上讲,相识还是聚合是有编程者的意图而不是由显式的语言机制决定的。
25、一个不考虑系统变化的设计在将来就有可能需要重新设计。
26、模式与框架的区别:
设计模式比框架更抽象
设计模式是比框架更小的体系结构元素
框架比设计模式更加特例化
27、怎样选择设计模式:
考虑设计模式是怎样解决设计问题的
浏览模式的意图部分
研究模式怎样互相关联
研究目的相似的模式
检查重新设计的原因
考虑你的设计中哪些是可变的
28、怎样使用设计模式:
大致浏览一遍模式,确定它适合你的问题
回头研究结构部分、参与者部分和协作部分:确保理解了该模式的类和对象以及它们之间的关联。
看代码示例,学习代码形式。
使用模式参与者的名字命名你的类
定义类:声明接口,定义继承关系,定义代表数据和对象引用的实例变量
定义模式中专用于应用的操作名称
实现执行模式中责任和协作的操作