设计模式简介
每一个模式描述在我们身边不断重复发生的问题以及该问题的解决方案
设计模式描述软件设计过程中某一常见问题的一般性解决方案
面向对象设计模式描述了面向对象设计过程中,特定场景下类和相互通信对象之间常见的组织关系.
设计模式和面向对象
面向对象设计模式解决的是类和相互通信对象之间的组织关系,包括他们的角色,指责,协作方式几个方面。
面向对象的设计模式是好的面向对象的设计。所谓好的面向对象的设计是可以满足应对变化,提高复用的设计。
面向对象的设计模式是描述设计的,因此他是独立于语言的,但是面向对象的设计模式最终实现仍然要用面向对象的语言来实现
面向对象的设计模式不想算法技巧,可以照搬照用,它是建立在对面向对象纯熟,深入理解的基础上的经验认识。掌握面向对象的设计模式的前提是掌握面向对象思想
从一个实例谈起
我们需要设计一个人事管理系统,其中一个功能时对不同类型员工,计算其工资--不同类型的员工,有不同的薪金计算制度。
结构化做法:
1.获取人事系统中所有的员工
2.根据不同的员工类型所对应的不同的薪资制度,计算其工资
enum EmployeeType{
Engineer;
Sales;
Manage;
}
//计算工资程序
if(type == EmployeeType.Engineer){
}else if(type == EmployeeType.Sales){
}
面向对象的设计
1.根据不同的员工类型设计不同的类,并是这些类继承自Employee抽象类,其中有一个抽象方法getSalary();
2.在各个不同的员工类型中,重写getSalary()方法
abstract Employee{
pulbic abstract int getSalary()
}
class Engineer:Employee{
}
etc.....
重新认识面向对象
《1》对于前面的例子,从宏观层上面看,面向对象的构建方式更能适应软件变化,能将变化所带来的影响减少最少。
《2》从微观上面看,面向对象的方式更强调各个类的责任,新增加员工类型不会影响原来员工类型的实现代码---这更符合真实世界,
也更能控制变化影响的范围,毕竟ENGINEER类不应该为新增加的终点工来买单。。。
《3》对象是什么
从概念层讲:对象是拥有某中责任的抽象
从规格层讲:对象是一系列的可以被其他对象使用的接口
从语言实现层讲:对象封装代码和数据
《4》有了这些认识后,怎样才能设计好的面向对象
遵循一定面对对象设计原则
熟悉一些典型的面向对象设计模式
从设计原则到设计模式
《1》针对接口编程,而不是实现编程
客户无需要知道所有的特定类型,只需要知道对象拥有客户所期望的接口
《2》优先使用对象组合,而不是继承
类继承通常为白箱复用,对象组合是黑箱复用,继承在某种程度上破坏了封装性,子类父类耦合度高;而对象组合只要求被组合的对象具有良好的定义接口,偶额度底
《3》封装变化点
《4》使用重构得到模式--设计模式不应该先入为主,一上来就使用设计模式是对设计模式最大的误区,没有一步到位的设计模式。敏捷软件开发实践提倡 重构到模式 是
目前普遍公认的最好的使用设计模式。
《5》单一职责
一个类应该仅有一个引起他变化的原因
《6》开闭原则
类模块应该是可以扩展,但是不可以修改
《7》里氏替换原则
子类可以替换父类出现,而且行为不会变化
《8》依赖倒置原则
高层模块不应该依赖底层模块,二者都应该依赖抽象
抽象不应该依赖实现细节,实现细节应该依赖抽象
《9》接口隔离原则
不应该强迫可以程序依赖他们不使用的方法
《10》迪米特法则
最少知识原则