所谓设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易地被他人理解、保证代码的可靠性。
简单的说,就是别人用过的、高效的一套经验宝典。我们之所以学习这些,是为了学会应用这些模式到自己所写的代码中以提高我们的代码的可读性和健壮性。
设计模式根据其目的来分类的,可分为创建型、结构型、行为型模式。
创建型模式简单的说就是用来创建对象的,将对象的创建和使用分离,外界在使用这些对象的时候,使用它们的接口而不直接触碰其细节。
结构型模式用来处理类或者对象的组合,将类和对象结合在一起实现指数化效应来形成更大的结构。在结构型模式中分为类结构和对象结构,前者关注类的组合,重心在继承与实现关系,后者关心类和对象的组合,在一个类汇总定义另一个类的实例对象,再通过这个对象调用方法。
行为型描述类或者对象的交互和职责的分配,通过行为模式可以更加清晰地划分类与对象的职责。在行为型模式中分为类行为型和对象行为型,前者多继承,后者多关联。
简单工厂模式
简单工厂模式,可以这么理解,一个抽象角色和一堆具体角色在一个工厂中完成他们的封装。比如说,海尔电视机和海信电视机都是电视机,就可以抽象一个电视机的抽象类,在具体实现时通过这个工厂再生成相应的牌子的电视机。
工厂方法模式
工厂方法的引入是因为简单工长模式中所有的产品都是由一个工厂创建的,如果再想添加新产品就需要修改工厂的代码,违背了开闭原则,因此,在工厂方法中,多添加一个抽象的工厂,将原来写得具体的工厂,再次进行抽象和具体化。此时,具体的工厂类中进行创建工作,这样就可以在不修改工厂角色的情况下引进新产品。
抽象工厂模式
正如工厂方法模式和简单工厂模式的关系,抽象工厂模式是在工厂方法模式的基础上再进行改造。实际生活中,一个工厂常常不止只生产一种产品,比如海尔,海尔有电视有洗衣机有热水器。此时包含的角色包括抽象工厂、具体工厂、抽象产品、具体产品。有利于添加新的产品族。
建造者模式
面对一个任务,一人完成困难时,我们通常会采用分工合作的方式,同时这个分工合作通常各自做的都是各自的优势部分。在实际的生产也是一样的,比如汽车制造业和手机业。使用建造者模式,将模拟这个过程,使用抽象建造者、具体建造者、指挥者和产品角色。具体建造者实现抽象建造者并且生成具体的产品,指挥者的存在负责控制产品的生成过程,并且可以隔离客户。
原型模式
针对某些系统中,需要重复使用的/重复创建的对象,通过原型模式,不断的复制这个原型创建更多类型的对象。在这个复制过程中,有所区分,有的只是简单复制“外形”、有的复制“内在”,这就对应浅克隆和深克隆。
单例模式
在数据库的学习中对于一个表的主键,往往是固定且唯一的,生活中也有很多这样的例子,比如身份证号。然而,对于像这样的只有一个实例的情况,包含的角色有且只能有一个——单例类,这个类拥有一个私有的构造函数,确保用户无法实例化。同时在这个模式中,包含一个静态私有的成员变量和静态公有的工厂方法将这个实例保存在静态成员变量中,确保只有一个实例被创建。
适配器模式
适配器的存在是为了解决不兼容的问题,也就是将客户提供一个接口转换为另一个接口,以确保客户类的正常工作。此过程中,客户类不直接访问为其兼容的类。
桥接模式
生活中使用桥是为了在水陆之间建立联系,而这个桥接模式是为了将抽象与实现部分分离,就是现实一个脱耦的过程,将原来直接的关系改成比较弱的关联,将原来的继承关系使用关联关系,使其比较相对独立的变化而不是相互牵连的有限制的问题。
组合模式
组合模式在我看来其实是一个递归的过程,不过,这个递归有点特殊,递归的内容有可递归的有不可递归的。组合模式就是将这些有差异的对象一致地处理他们。
装饰模式
装饰模式即不创建子类的情况下,将对象的功能加以扩展,动态的给一个对象加上更多的责任,保护了类的封装性。
外观模式
许多的网页的主页面和子页面都布局的差不多,而其具体的功能却不同,这个就是外观模式。外部与子系统通信通过外观模式,外观模式定义了一个接口,这个接口使得子系统更容易的被使用。相当于,我们通过外观模式(门)进入其子系统(房间)。
享元模式
享元工厂维护一个享元池,这个享元池中的内容可以被共享,而其他的内容不能被共享。
代理模式
当一个客户不想和另一个客户进行交互时,引入“代理”的第三者来实现间接引用。类似我们买房时,面对的房产中介就是这里的代理。由代理来控制原对象的引用。
职责链模式
职责链模式的描述可以看成食堂打饭的例子,或者是某个程序向系统申请资源的过程。为了避免请求者和接受者耦合在一起,使得多个对象都有可能接收请求,将这些对象链接成一条链,沿着这条链传递请求。
命令模式
在职责链模式中,避免请求者和接收者耦合,但是没有实现他们的完全解耦,而命令模式就是实现了这个部分。将请求进行封装,可以封装上接受者的相关信息和其他信息,同时可以支持撤销的操作。
解释器模式
通过制作一个“解释器”来识别和处理那些出现率特别高的语句。
迭代器模式
外部对象实现对一个聚合对象的遍历的同时不暴露其具体的内部结构。利用抽象迭代器和具体迭代器、抽象聚合类和具体聚合类,实现存储数据和遍历数据这两个功能,方便了聚合对象的操作。
中介者模式
中介者模式有点类似于代理模式的感觉,都是通过一个对象来实现其他两个对象的交互。在此模式中,使各对象可以独立地改变他们之间的交互,而不一直受其他或更多对象的影响。
备忘录模式
与其说它是备忘录,不如说他是“后悔药”模式。这个直观的感受就是“撤销”功能。
观察者模式
这个听起来很像代理模式或者中介者模式,但是又有所不同。观察者模式,建立了对象的依赖关系,一个对象发生改变的时候,观察者通过类似广播的形式来告知其他对象。
状态模式
在生活中,我们经常可以见到状态的变化,比如在买火车票的时候,车票数的变化,如何在等红绿灯的时候,颜色的变化。看起来这些状态的变化好像修改了整个内容,但是实际并没有,这个就是状态模式。
策略模式
什么叫做策略呢?简单的理解应该就是对不同的事务有不同的解决方案。策略模式就可以使得系统灵活的选择解决途径,也可以方便的添加新的解决途径。
模板方法模式
模板方法基于代码的复用,将相同的代码放在父类中,具体实现不同的子类。
访问者模式
在做系统的时候,一再被强调的是权限权限!而访问者模式就是针对不同的对象给出不同的内容。在不改变各元素的类的前提下定义作用于这些元素的新操作。