设计模式
设计模式: 面向对象编程过程中解决问题的解决方案,利用面向对象的的三大特性:封装、多态、继承进行设计,以达到代码复用、增加可维护性的目的。
在学习常见的设计模式前,先了解设计模式中基本的原则。
设计原则
单一责任原则(Single Responsibility Principle): 就一个类而言,仅有一个引起它变化的原因(一个类只有一个职责)
开发-封闭原则(Open Closed Principle): 软件实体应该是可扩展,而不可修改的。即对扩展是开放的,而对修改是封闭的。OCP是所有面向对象原则的核心。
依赖倒转原则(Dependence Inversion Principle): 上层模块不应该依赖底层模块,它们都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。
里氏代换原则(Liskov Substitution Principle): 子类型必须能够替换掉它们的的父类型。
迪米特法则(Law of Demeter): 如果两个类不彼此直接通信,那么两个类之间不应当发生直接的相互作用。如果其中一个类需要调用另一个类的方法,可以通过第三者转发调用。
接口隔离原则(Interface Segregation Principle): 客户端不应该依赖它不需要的接口;类间的依赖关系应该建立在最小的接口上。
常见设计模式
设计模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)。
创建型模式
工厂模式(Factory Pattern)
定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
当明确计划依据不同条件创建不同实例时,考虑使用工厂模式
抽象工厂模式(Abstract Factory Pattern)
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
当系统的产品有多于一个的产品族,而系统只消费其中某一族的产品时,考虑使用。
单例模式(Singleton Pattern)
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
Singleton类的构造函数为private,在GetInstance()方法中依据实例存在情况决定是否实例化。
当严格控制实例数量(如窗口数目)时,考虑使用。
建造者模式(Builder Pattern)
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序是稳定的,而对象内部的构建通常是面临复杂变化的。
结构型模式(Structural Patterns)
适配器模式(Adapter Pattern)
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
当已有类的接口与期待的接口不同时,使用适配器适配接口。
桥接模式(Bridge)
将抽象部分与实现部分分离,使它们都可以独立的变化。实现是指抽象类和它的派生类用来实现自己的对象。
实现系统可能有多个角度分类,每一种角度都可能变化时使用。
组合模式(Composite Pattern)
将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
适用于:1、想表示对象的部分-整体层次结构(树形结构)。 2、希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
行为型模式(Behavioral Patterns)
策略模式(Strategy Pattern)
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
需要在不同的条件下应用不同的业务规则(算法)时就可以考虑使用策略模式。
观察者模式(Observer Pattern)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
当希望一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知并作出更新时使用。