一、OO基础
以往是代码复用,现在是经验复用!
良好的OO设计必须具备可复用、可扩充、可维护三个特性。
模式不是代码,而是针对设计问题的通用解决方案。
大多数的模式和原则,都着眼于软件变化的主题。
模式是被“发现的”,而不是被“创建的”。
将你的思绪集中在设计本身,而不是在模式上。我们的目标是简单,只有真正需要时才使用模式。
面向对象设计包含抽象、封装、继承、多态四大特性。
抽象:抽象是提取现实世界中某事物的关键特性,为该事物构建模型的过程。对同一事物中不同的需求下,需要提取的特性可能不一样。得到的抽象模型中一般包含:属性(数据)和操作(行为)。这个抽象模型我们称之为类,通过对类进行实例化得到具体的对象。
封装:封装可以使类具有独立性和隔离性,从而保证类的高内聚。只暴露给类外部或者子类必须的属性和操作。类封装的实现依赖类的修饰符(public、protected和private)。
继承:继承是对现有类的一种复用机制。一个类如果继承现有的类,则这个类将拥有被继承类的所有非私有特性(属性和操作)。这里指的继承包含类的继承和接口的实现。常见的继承方法有共有继承、私有继承、多重继承、多层继承。
多态:多态是中继承的基础上实现的。多态的三个要素:继承、重写和父类引用指向子类的对象。父类引用指向不同的子类对象时,调用相同的方法,呈现出不同的行为;就是类的多态性。多态还可分为编译时多态(静态多态性)和运行时多态(动态多态性)。另外类的函数重载、运算符重载,也可算为多态的特性。
二、OO原则
封装变化:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
针对接口编程,不要对实现编程:针对接口编程真正的意思是针对超类型(supertype)编程,这样可以在运行时才指定具体实现的对象。
多用组合,少用继承:使用组合建立系统具有很大的弹性,不仅可将算法族封装成类,更可以“在运行时动态地改变行为”,只要组合的行为对象符合正确的接口标准即可。
为了交互对象之间的松耦合设计而努力:松耦合的设计之所以能让我们建立有弹性的OO系统,能够应付变化,是因为对象之间的互相依赖降到了最低。
类应该对扩展开放,对修改关闭:我们的目标是允许类容易扩展,在不修改现有代码的情况下,就可搭配新的行为。这样的设计具有弹性可以应对改变,可以接受新的功能来应对改变的需求。
赖倒置原则(Dependency Inversion Principle):要依赖抽象,不要依赖具体类依。
最少知识原则:只和你的密友谈话。
好莱坞原则:别调用(打电话给)我们,我们会调用(打电话给)你。
单一责任原则:一个类应该只有一个引起变化的原因。
三、OO模式
3.1 模式简介
一句话描述各设计模式:
- 命令:封装请求称为对象;
- 外观:简化一群类的接口;
- 单件:确保有且只有一个对象被创建;
- 代理:包装对象,以控制对此对象的访问;
- 组合:客户用一致的方式处理对象集合和单个对象;
- 状态:封装了基于状态的行为,并使用委托在行为之间切换;
- 策略:封装可以互换的行为,并使用委托来决定要使用哪一个;
- 适配器:封装对象,并提供不同的接口;
- 观察者:让对象能够在状态改变时被通知;
- 装饰者:包装一个对象,以提供新的行为;
- 迭代器:在对象的集合之中游走,而不暴露集合的实现;
- 模板方法:由子类决定如何实现一个算法中的步骤;
- 工厂方法:由子类决定要创建的具体类是哪一个;
- 抽象工厂:允许客户创建对象的家族,而无需指定他们的具体类;
3.2 模式分类
GoF将模式的分类:创建型、行为型和结构型:
image注意:怎么分类不重要,重要的是了解这些模式和它们之间的关系。
3.3 模式描述及类图
策略模式——定义算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
image观察者模式——定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
image装饰者模式——动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
image image简单工厂模式——由工厂类(SimplePizzaFactory)来处理对象的创建,客户类(PizzaStore)负责产品(Pizza)的制作。
image工厂方法模式——由工厂超类(PizzaStore)来处理对象的使用,工厂子类(NYPizzaStore、ChicagoPizzaStore)处理对象(Pizza)的创建。工厂方法让类把实例化推迟到子类。
image抽象工厂模式——提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
image image单件模式——确保一个类只有一个实例,并提供一个全局访问点。
image命令模式——将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作(命令模式将动作请求与动作执行解耦)。
image适配器模式——将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
image外观模式——提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
image模版方法模式——在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
image迭代器模式——提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
image组合模式——允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
image image状态模式——允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
image代理模式——为另一个对象提供一个替身或占位符以控制对这个对象的访问。
imageMVC复合模式——模型利用“观察者”让控制器和视图可以随最新的状态改变而更新;视图和控制器则实现了“策略模式”,控制器是视图的行为,如果你希望有不同的行为,可以直接换一个控制器;视图内部又使用“组合模式”来管理窗口、按钮以及其他显示组件。
image image imageModel 2复合模式——Model 2是MVC在Web上的应用。
image image
网友评论