1. 设计模式概述
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
当前遇到的问题,绝大多数都是前人已经踩过的坑,他们总结了一系列 “套路”,来解决各种各样的问题。这些套路可以被重用,从而使得代码更容易被理解和拓展,并保证代码的可靠性。
就像是练武,只会一些拳脚功夫是不够的,还需要成体系的武功秘籍来融会贯通。这套武功秘籍会告诉你遇到什么样的敌人应该使用什么招式,也会告诉你应该如何去做才不至于走火入魔。
设计模式的重要性不言而喻,懂的都懂,学就完事了。
2. 设计模式分类
经典的设计模式一共有23种(当然还有其他一些模式),这些设计模式根据目的可以被分为三大类:
(1) 创建型模式
这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
单例模式:创建单例对象的最佳方式
工厂模式:由一个工厂类来创建不同类的实例对象
抽象工厂模式:由一个超级工厂类来创建不同的工厂,从而生产产品
建造者模式:
原型模式:
(2) 结构型模式
这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。
代理模式:
适配器模式:
桥接模式:
装饰器模式:
外观模式:
享元模式:
组合模式:
(3) 行为型模式
这些设计模式特别关注对象之间的通信。作用于类或对象之间相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责。
责任链模式:
命令模式:
解释器模式:
迭代器模式:
中介者模式:
备忘录模式:
观察者模式:
状态模式:
策略模式:
模板方法模式:
访问者模式:
3. 设计模式六大原则
(1) 单一职责原则(Single Responsibility Principle, SRP)
对于一个类而言,应该只有一个引起它变化的原因。
也就是说,一个类只负责一个功能,不能因为每次引入新功能,都要去修改这个类,除非是这个类本身发生了改变。
(2) 开闭原则(Open-Closed Principle, OCP)
一个软件实体应当对扩展开放,对修改关闭
也就是说,尽量通过继承抽象类或者实现接口的方式来进行功能增强,而不是直接对原有代码进行修改。
(3) 里氏替换原则(Liskov Substitution Principle, LSP)
所有引用基类(父类)的地方必须能透明地使用其子类的对象。
也就是说,应该能够把使用父类的地方,直接替换成子类。
这就要求尽量把父类设计为抽象类或者接口,且不要去重写父类中的方法,使其功能在所有子类中都相同。
(4) 依赖倒置原则(Dependence Inversion Principle,DIP)
高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。
也就是说,要面向接口编程,不要面向实现编程。
(5) 接口隔离原则(Interface Segregation Principle, ISP)
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
也就是说,接口也是需要单一职责的,不要把不相关的方法都声明在一个接口中,否则类就得实现这些它并不关心的方法。
(6) 迪米特法则(Law of Demeter, LoD)
一个软件实体应当尽可能少地与其他实体发生相互作用。
也就是说,通过引入一个合理的第三者来降低现有对象之间的耦合。
每个类的成员变量和方法,能不public就不public,避免被随意引用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。