七大设计原则
软件的可维护性和可复用性(?)
软件可维护性:即维护人员对该软件进行维护的难易程度,具体包括理解、改正、改动和改进该软件的难易程度。
可复用性:复用又叫重用,是重复使用的意思。指软件能够被重复使用的难易程度
面向对象设计原则为支持可维护性复用而诞生
指导性原则,非强制性原则
每一个设计模式都符合一个或多个面向对象设计原则,面向对象设计原则是用于评价一个设计模式的使用效果的重要指标之一
面向对象设计原则概述
- 单一职责原则:一个对象应只包含单一的职责,并且该职责被完整地封装在一个类中
- 开闭原则:软件实体应当对扩展开放,对修改关闭
- (LSP)里氏代换原则:所有引用基类的地方必须能透明地使用其子类的对象
- 子类必须能够替换掉他们的父类型
- 只要是基类出现的地方,一定能出现子类
- 子类必须能够替换掉他们的父类型
- 依赖倒转原则:高层模块不应该依赖底层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象
- 其核心思想是:要面向接口编程,不要面向实现编程
- 其核心思想是:要面向接口编程,不要面向实现编程
- 接口隔离原则:客户端不应该依赖那些它不需要的接口
- 合成复用原则:优先使用对象组合,而不是继承来达到复用的目的
- 它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。如果要使用继承关系,则必须遵循
- 迪米特法则:每一个软件单位对其他的单位都只有最少的知识,而且局限于哪些本单位密切相关的软件单位
- LoD又叫做最少知识原则(LKP),其定义是:只与你的直接朋友交谈,不跟“陌生人“说话。建议多使用Private和Protect,少用public
- LoD又叫做最少知识原则(LKP),其定义是:只与你的直接朋友交谈,不跟“陌生人“说话。建议多使用Private和Protect,少用public
- 单一职责原则:一个对象应只包含单一的职责,并且该职责被完整地封装在一个类中
设计模式的分类
根据其目的(模式是用来做什么的)可分为创建型、结构型和行为型三种:
①创建型模式主要用于创建对象。
②结构型模式主要用于处理类或对象的组合。
③行为型模式主要用于描述对类或对象怎样交互和怎样分配职责。
单例模式
- 确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例
简单工厂模式:又称为静态工厂方法模式, 它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。
1
2
3
4
5
6
7模式角色
工厂:Factory
由客户端直接调用,在该类中声明一个创建新对象的接口
抽象产品: Product
具体产品的共同接口,是所要创建的对象的公共父类
具体产品:ConcreteProduct
由工厂所创建的对象工厂方法模式又称为工厂模式, 它属于类创建型模式。在工厂方法模式中, 工厂父类负责定义创建产品对象的公共接口, 而工厂子类则负责生成具体的产品对象, 这样做的目的是将产品类的实例化操作延迟到工厂子类中完成, 即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
提供一个创建一系列相关或相互依赖对象的接口, 而无须指定它们具体的类。抽象工厂模式又称为Kit 模式,属于对象创建型模式。
–抽象工厂模式包含以下4个角色:
•AbstractFactory(抽象工厂)
•ConcreteFactory(具体工厂)
•AbstractProduct(抽象产品)
•ConcreteProduct(具体产品)
建造者模式
•将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示。
–建造者模式包含以下4个角色:
•Builder(抽象建造者)
•ConcreteBuilder(具体建造者)
•Product(产品)
•Director(指挥者)
重点:建造者的退化模式是通过合并抽象建造者、指挥者角色完成退化的。
•原型模式的定义
–利用一个对象,快速地生成一批对象.
–通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址,每一个克隆对象都是独立的
–
–原型模式包含以下3个角色:
•Prototype(抽象原型类)
•ConcretePrototype(具体原型类)
•Client(客户类)
•浅克隆与深克隆
–浅克隆(Shallow Clone):当原型对象被复制时,只复制它本身和其中包含的值类型的成员变量,而引用类型的成员变量并没有复制
浅拷贝:仅仅复制所考虑的对象,不复制它所引用的成员对象,例如Sheet s。
深拷贝:**两者都复制。**
•结构型模式**(Structural Pattern)**关注如何将现有类或对象组织在一起形成更加强大的结构
•不同的结构型模式从不同的角度组合类或对象,它们在尽可能满足各种面向对象设计原则的同时为类或对象的组合提供一系列巧妙的解决方案
适配器模式:将一个类的接口转换成客户希望的另一个接口,适配器模式让那些接口不兼容的类可以一起工作
适配器模式包含以下3个角色:
•Target(目标抽象类)
•Adapter(适配器类)
•Adaptee(适配者类)
- 类适配器
•理解2:对象适配器(组合聚集)
•对象适配器模式是合成复用原则的典型应用。
总结
•模式优点
–将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构
–增加了类的透明性和复用性,提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用
–灵活性和扩展性非常好
–类适配器模式:置换一些适配者的方法很方便
–对象适配器模式:可以把多个不同的适配者适配到同一个目标,还可以适配一个适配者的子类
- 外观模式:又称为门面模式
是迪米特法则的一种具体实现
1.通过引入一个新的外观角色来降低原有系统的复杂度,同时降低客户类与子系统的耦合度
2.对客户屏蔽了子系统组件,减少了客户处理的对象数
3.使得子系统使用起来更加容易
4.降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程
1 | 外观模式包含以下2个角色: |
它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目并使得子系统使用起来更加容易
它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可
一个子系统的修改对其他子系统没有任何影响,而且子系统的内部变化也不会影响到外观对象
外观模式-模式缺点
–不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性
–如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则
代理模式的定义
–引入一个新的代理对象
–代理对象在客户端对象和目标对象之间起到中介的作用
–去掉客户不能看到的内容和服务或者增添客户需要的额外的新服务
1 | 代理模式包含以下3个角色: |
•策略模式的定义
–又称为政策(Policy)模式
–每一个封装算法的类称之为策略(Strategy)类
–策略模式提供了一种可插入式(Pluggable)算法的实现方案
1 | 策略模式包含以下3个角色: |
命令模式
命令模式:**请求以命令的形式包裹在对象中,并传给调用对象。对请求排队或者记录请求日志,以及支持可撤销的操作。
命令模式包含以下4个角色:
•Command(抽象命令类)
•ConcreteCommand(具体命令类)
•Invoker(调用者)
•Receiver(接收者)
–观察者模式:
•定义了对象之间一种一对多的依赖关系,让一个对象的改变能够影响其他对象
•发生改变的对象称为观察目标,被通知的对象称为观察者
•一个观察目标可以对应多个观察者
状态模式
模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类不改变一个算法的结构即可重定义该算法的某些特定步骤。
(1)AbstractClass 抽象类
类中实现了模板方法,定义了算法的骨架,具体子类需要去实现,其他的抽象方法o1,2,3,4
(2)ConcreteClass 实现抽象方法
1
2
3模板方法模式包含以下两个角色:
AbstractClass(抽象类)
ConcreteClass(具体子类)