前言
在我平时的学习与项目工作中,经常会纠结于类的框架搭建,以及类间的关系梳理,而当我通过查看一些牛人的代码解释时总会有一种有一种豁然开朗之感,感觉别人写的代码层次清晰,易于理解。久而久之,我确实感觉到了设计模式在项目工作中的重要性,所以这段时间我会简单的学习Java中的设计模式,当然深刻的理解设计模式需要有足够的项目经验,目前我只希望大致了解各种设计模式功能,希望在以后的项目中能够使用并加深理解。
什么是设计模式?
模式描述的是我们周围经常重复发生的问题,以及该问题的解决方案的核心。而模式更是一种经验的的积累与总结 , 所以通过模式,我们可以站在巨人的肩膀上去思考问题、解决问题,熟练使用设计模式可以提高我们的工作效率,改善产品质量,最终带来经济效益。因此对于任何想开发出灵活高效、健壮的软件产品的个人或团体,熟练掌握并正确使用设计模式都是必须掌握的基本技能。
设计模式的六大原则
对于设计模式来说,为什么这个模式要这样解决这个问题,而另一个模式要那样,它们背后都遵循的就是永恒的设计原则。 可以说,设计原则是设计模式的灵魂。
1.单一职责原则(SRP)
“对于一个类而言,仅有一个能够使它变化的原因”,也就是说不要把原因变化各不相同的职责放在一个类中,而应该 将不同的职责分配给不同的类,使单个类的职责尽量单一,避免类间相互影响。
例如 :参考下图中的设计,图形计算程序只使用了正方形的 Area() 方法,永远不会使用 Draw() 方法,而它却跟 Draw 方法关联了起来。这违反了单一原则,如果未来因为图形绘制程序导致 Draw() 方法产生了变化,那么就会影响到本来毫不关系的图形计算程序。
那么我们该怎么做呢?如下图,将不同的职责分配给不同的类,使单个类的职责尽量单一,就隔离了变化,这样他们也不会互相影响了
2.里氏替换原则(LSP)
“子类型必须能够替换掉它们的基类型。”也就是说继承中的“ IS A ”关系是必须保证的,否则还算什么继承啊!如果违反了 LSP 原则,常会导致在运行时 (RTTI) 的类型判断违反”开放-封闭原则” 。
里氏代换原则是对“开放-封闭”原则的补充。实现“开闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。里氏替换原则中,子类对父类的方法尽量不要重写和重载。因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它。
3.依赖倒置原则(DIP)
面向接口编程,依赖于抽象而不依赖于具体。写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。
例如 :参考下图的设计,一个开关跟灯直接连接在一起了,也就是说开关依赖于灯的打开和关闭方法,那么如果我想用这个开关也可以打开其他东西呢,比如电视、音响。显然这个设计是无法满足这个要了,因为我们依赖了具体而不是抽象,这个开关已经等价于“灯的开关”。
那么我们该如何来设计一个通用的开关呢?参考下图的设计, OK !现在我们不仅可以打开灯,还可以打开电视和音响,甚至未来任何实现了“开关接口”的任何东西。
4.接口隔离原则(ISP)
每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。
例如 :参考下图的设计,在这个设计里,取款、存款、转帐都使用一个通用界面接口,也就是说,每一个类都被强迫依赖了另两个类的接口方法,那么每个类有可能因为另外两个类的方法 ( 跟自己无关 ) 而被影响。拿取款来说,它根本不关心“存款操作”和“转帐操作”,可是它却要受到这两个方法的变化的影响,真是土鳖!!!
那么我们该如何解决这个问题呢?参考下图的设计,为每个类都单独设计专门的操作接口,使得它们只依赖于它们关系的方法,这样就不会互相影响,也就不会在发生土鳖的事情了!
5.迪米特法则(最少知识原则)
一个类对自己依赖的类知道的越少越好。无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。 迪米
特法则就要求类“小气”一点,尽量不要对外公布太多的 public 方法和非静态的 public 变量, 尽量内敛, 多使用 private,package-private、protected 等访问权限。
6.开放封闭原则(OCP)
“软件实体 ( 类、模块、函数等 ) 应该是可以扩展的,但是不可修改。”即 可以随便增加新的类,但是不要修改原来的类
例如 :如下图,有一个客户端程序通过数据访问接口操作数据,对于这套系统来说,一开始计划使用的是 SQL Server 或 Oracle 数据库,但是后来考虑到成本,改用免费的 MySQL ;那么对于客户端程序来说,后来数据的扩展对它没有任何影响,它在不知不觉间就用上了免费好用的 MySQL 数据库,这全要感谢 OCP 原则。
设计模式分类
- 创建型模式:关注对象的创建过程。
工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 - 结构型模式: 关注对象和类的组织。
适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 - 行为型模式:关注系统中对象之间的相互交互,研究系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。
策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
好了简单的介绍了设计原则与设计模式分类,接下来将会逐步介绍各个设计模式。
文章借鉴: http://www.cnblogs.com/justinw/archive/2006/11/28/574573.html