设计模式浅谈
模式最早起源于建筑业而非软件业,经大量研究发现人们对舒适住宅和周边环境存在一些共同的认同规律,通过这些规律,可以归纳出设计模式来解决建筑时出现的一般性问题。不同的模式描述了在我们环境中不断出现的问题,然后描述了该问题的解决方案的核心,通过这种方式,我们可以无数次的重用那些已有的解决方案,无须再重复相同的工作。对于软件行业的设计模式大体也是这个意思。通过对代码分类编目,总结代码设计经验,来设计解决一些特定问题的方案,实现代码复用的目的。设计模式一般包含四个基本要素:模式名称、问题、解决方案和效果。根据其设计目的一般可分为创建型、结构型和行为型。下面就对软件的23种模式简单描述我自己的理解。
创建型模式:即对类的实例化过程进行了抽象,能够达到软件模块与对象的创建和组织无关。
1.简单工厂模式:通过参数的不同返回不同类的实例,具体来说就是一个抽象接口类,定义了具体类中的方法,具体类继承分类并实现其方法,再建立一个工厂类,创建静态工厂方法并设置不同的参数实例化不同的具体类,在进行父类中方法的调用。
2.工厂方法模式:分别创建抽象工厂类和抽象产品类,抽象产品类定义产品的接口,具体产品实现抽象产品接口,抽象工厂类声明工厂方法用于返回一个产品,具体工厂实现工厂方法,并可由客户调用。
3.抽象工厂模式:分别创建抽象工厂类和抽象产品类,抽象工厂类中声明创建抽象产品的方法,具体工厂中创建具体产品;抽象产品类为每一种产品声明接口,具体产品类则定义具体产品类型,实现接口。
4.建造者模式:将部件和其组装过程分开,一步一步创建一个复杂的对象,用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造。抽象建造者类定义产品各个部件的接口,并且返回复杂对象;具体建造者类实现各个部件的构造方法;产品角色,被构建的复杂对象,包含多个部件;指挥者,负责安排复杂对象的建造次序。
5.原型模式:复制原型创建新的对象。抽象原型类,定义具有克隆自己的方法接口;具体原型类,实现具体的克隆方法,并返回自己的一个克隆对象。
6.单例模式:确保一个类只有一个实例,自行实例化并向整个系统提供这个实例。在类中定义一个静态私有变量,并在静态共有方法中对其进行实例化。同时还要拥有一个私有构造函数,确保外界不能通过new实例化它。
结构型模式:描述如何将类或者对象结合在一起形成更大的结构。
7.适配器模式:将一个接口转换为客户希望的一个接口。目标抽象类定义客户想用的特定领域接口;适配器,作为一个转换器,实现特定领域接口的方法,并在方法中调用适配者类;适配者类,即被适配的角色,定义用户使用的业务。
8.桥接模式:抽象部分与实现部分分离,使其可独立变化。抽象类定义抽象类的接口,一般为抽象类,同时设置一个业务接口的保护成员变量;扩充抽象类,实现抽象类中的定义的方法;实现类接口,定义自己的业务;具体实现类,实现接口中的方法。
9.组合模式:对单个对象(叶子)和组合对象(容器)的使用具有一致性。抽象构件,抽象类或接口,声明叶子构件和容器构件的接口,并定义管理子构件的方法;叶子构件,实现抽象构件中的行为,没有子节点;容器构件,实现抽象构件中的行为,可递归调用其子节点的业务。
10.装饰模式:动态地给一个对象增加一些额外的职责。抽象构件类,定义了对象的接口,可以给对象动态增加职责;具体构件,实现声明的方法,并可以增加额外的职责;抽象装饰类,抽象构建类的子类,可给具体构件增加职责,但在其子类中实现;具体装饰类,可调用抽象装饰类中的方法也可增加新的方法。
11.外观模式:外部与子系统的通信通过一个统一的外观对象进行。外观角色,将客户端发来的请求委派到相应的子系统中去进行处理;子系统角色,实现子系统的功能,定义子系统行为。
12享元模式:运用共享技术有效地支持大量细粒度对象的复用。抽象享元类,定义具体享元类公共的方法;具体享元类,为内部状态提供了存储空间,实现其具体方法;非共享具体享元类,不能被共享的子类;享元工厂类,创建并管理享元对象。
13.代理模式:给某一对象提供一个代理,并由代理对象控制对原对象的引用。抽象主题角色,真是主题和代理主题的共同接口,声明真实主题的业务方法。代理主题角色,控制对真实主题及其业务的使用,真实主题角色,实现抽象主题角色中定义的方法。
行为型模式:对在不同的对象之间划分责任和算法的抽象化。
14.职责链模式:避免请求发送者和接受者耦合在一起,多个对象都可能接受请求,将对象连成一条链,请求沿链传递,知道有对象处理它。抽象处理者,定义了抽象请求处理方法以及处理者的下家;具体处理者,实现请求处理方法,并判断是否可进行处理,不行,则传递请求到下家。
15.命令模式:将请求封装成一个对象,可用不同的请求对客户进行参数化。抽象命令类,声明用于执行请求的方法;具体命令类,实现抽象类中的方法,并绑定接受者的动作;调用者,即请求发送者,通过命令对象来执行请求;接受者,实现对请求的业务处理。
16.解释器模式:定义语言的文法,建立一个解释器来解释语言中的句子。
17.迭代器模式:提供一种方法来访问聚合对象,而不暴露这个对象的内部表示。抽象迭代器,定义了访问和遍历元素的接口;具体迭代器,完成对聚合对象的遍历;抽象聚合类,存储对象,定义迭代器对象的接口,声明一个创建迭代器对象的方法;具体聚合类,实现创建迭代器的接口。
18.中介者模式:用一个中介对象来封装一系列的对像交互。抽象中介者,定义接口用于与同事对象之间通信;具体中介者通过协调各个同事对象来实现写作行为;抽象同事类,定义各同事的公有方法;具体同事类,每一个同事都引用一个中介者对象,先与中介者通信,通过中介者与其他同事通信。
19.备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
20.观察者模式:一个对象状态发生改变,其相关依赖的对象皆被自动更新。目标类,被观察对象,定义观察者集合,通知方法以及观察者增删;具体目标,实现了目标类中定义的抽象业务逻辑;观察者,声明更新方法;具体观察者,实现状态改变的具体方法。
21.状态模式:允许一个对象在其内部状态改变时改变他的行为,对象看起来似乎修改了它的类。
22.策略模式:定义一系列算法,将每个算法封装起来,并让他们可以相互替换。
23.模板方法模式:定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以改变一个算法的结构即可重定义该算法的某些特定步骤。