【前言】 每一种设计模式,怎么使用大家可能都会。但是在实际工作中,遇到形式各样的需求,却一时想不到使用什么样的设计模式来实现此需求。怎么办呢?这就是本文的立意。

设计模式分类

** 设计模式共有23种,分为三类:创建型、结构型、行为型。** ** 1、创建型:** 提供了一种在创建的对象的同时隐藏创建逻辑的方式,而不是使用new运算符直接实例化对象。 这使得程序在判断针对某个给定实例需要创建那些对象时更加灵活。 包含:工厂模式、抽象工厂模式、单例模式、创造者模式、原型模式。 2、结构型: 关注类和对象的组合,继承的概念被用来组合接口和定义组合对象获得新功能的方式。 包含:适配器模式、桥接模式、过滤器模式、组合模式、装饰器模式、 外观模式、享元模式、代理模式 ** 3、行为型:** 关注对象之间的通信 包含:责任链模式、命令模式、解释器模式、迭代器模式、中介者模式 备忘录模式、观察者模式、空对象模式、策略模式、模板模式、访问者模式。 【拓展:J2EE模式】 关注表示层,是由Sun java center鉴定的。 包含:MVC模式、业务代表模式、组合实体模式、数据访问对象模式、 前端控制器模式、拦截过滤器模式、服务定位器模式、传输对象模式

设计模式6大原则

  • 1、开闭原则:对扩展开放、对修改关闭
  • 2、里氏代换原则:任何基类可以出现的地方,子类一定可以出现。
  • 3、依赖倒转原则:针对接口编程,依赖抽象不依赖具体
  • 4、接口隔离原则:使用多个隔离的接口,比使用单个接口要好。
  • 5、迪米特法则,最少知道原则:一个实体应当尽量少地与其他实体类之间发生相互作用
  • 6、合成复用原则:尽量使用合成聚合的方式,而不是使用继承。

【1、工厂模式】

 * 属于创建型模式,我们创建的对象不会对客户端暴露创建逻辑
 * 通过使用一个共同的接口来指向新创建的对象。

1、作用: 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

2、自我概括 一个接口,有着不同的实现类。通过不同的条件,来获取实体类的对象。 3、应用举例 我想吃米线,米线分为“过桥米线”、“砂锅米线”、“酸辣米线”....

【抽象工厂模式】

		* 围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。       
		* 这种类型的设计模式属于创建型模式。

1、作用 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。主要解决接口选择的问题。 2、自我概括 多个接口,每个接口可以派生出多个实现类,来获取不同实体类对象。 3、应用举例 我想吃饭,这里有套餐A(米线、凉菜、饮料...)、套餐B(炸薯条、炸酱面...)....

工厂模式 抽象工厂模式
针对一个产品等级结构 面向多个产品等级结构
一个抽象产品类 多个抽象产品类
可以派生出多个具体产品类 每个抽象类可以派生多个具体产品类
每个具体工厂类只能创建一个具体产品类实例 每个具体工厂类,可以创建多个具体产品类实例

【2、单例模式】

1、作用 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 主要解决,一个全局使用的类频繁地创建与销毁。 2、自我概括 判断系统中是否已经有这个单例,有则返回,无则创建。 3、应用举例 整一个全局性的,例如每次登陆时,往session里塞一个用户对象。

【3、建造者模式】

1、作用 使用简单对象构建成复杂对象。 2、自我概括 一些基本的部分不会概念,其他组合的部分经常发生变化。 3、应用举例 我爱吃板面,板面是基本不变的,而其辣椒、豆腐皮、火腿、鸡蛋、生菜、海带、豆蔻、加面等都是经常变化的。然后会出现15元套餐A、套餐B...

【4、原型模式】

1、作用 实现一个原型接口,该接口用于创建当前对象的克隆。 2、自我概括 直接常见对象的代价比较大,我们可以缓存该对象,再下一个请求时返回它的克隆。 3、应用举例 当一个对象不容易创建时,使用克隆。

【5、适配器模式】

1、作用 作为两个不兼容的接口的桥梁,它结合了两个独立接口的功能。 2、自我概述 将一个类的接口转换成另一个接口,使得原本不兼容的,可以在一起工作。 3、应用举例 两个接口不兼容。

【 6、桥接模式】

1、作用 把抽象化与实现化解耦,使得两者独立变化。 2、自我概述 使实现类的功能独立于接口实现类,将抽象部分与实现部分分离,使他们独立变化。 3、应用举例 对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

【 7、过滤器模式-标准】

1、作用 使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把他们连接起来。 2、自我概括 其实是将组合型的过滤器和具体实现类型的过滤器进行抽象, 将不同类型的过滤器抽象出一个方法, 然后使用组合型的过滤器来组合, 最后达到应用多个过滤器过滤数据源的作用 3、应用举例 消息过滤器。

【 8、组合模式-整体】

1、作用 把一组相似的对象当做一个单一的对象。 2、自我概述 将对象组合成树形结构以表示“部分-整体”的层次结构。 3、应用举例 部分、整体场景,如树形菜单,文件、文件夹的管理。

【 9、装饰器模式】

1、作用 允许向一个现有对象添加新的功能,同时又不改变其结构。 2、自我概述 用装饰类包装原有的类,以提供额外功能。 3、应用举例 自行车上装了一个充电器,既能骑车,还能充电。

【 10、外观模式】

1、作用 隐藏系统的复杂性,向客户端提供一个客户端可以访问系统的接口。 2、自我概述 提供客户端请求的简化方法和对现有系统类方法的委托调用。 3、应用举例 将复杂的接口提供外界访问的模块。

【11、享元模式】

1、作用 用于减少创建对象的数量,减少内存占用和提高性能。 2、自我概述 尝试重复使用现有的同类对象,如果找不到匹配的对象,则创建新对象。 3、应用举例 1、系统有大量相似对象。 2、需要缓冲池的场景。

【12、代理模式】

1、作用 一个类代表另一个类的功能,为其他对象提供一种代理以控制对这个对象的访问。 2、自我概述 在直接访问对象时出现问题(远程服务、对象创建开销大、安全控制),我们可以在访问此对象时加上一个对此对象的访问层。 3、应用举例 想在访问一个类时做一些控制,增加中间层。

注意事项: 1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

【13、责任链模式】

1、作用 为请求创建了一个接收者对象的链,对请求的发送者和接收者进行解耦。 2、自我概述 每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么他会把相同的请求传给下一个接收者。让多个对象都有可能接收请求,将这些对象连接成一条链,并沿着这条链传递请求,直到有对象处理为止。 3、应用举例 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。

【14、命令模式】

1、作用 请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适对象,把命令传给相应的对象,执行该命令。 2、自我概括 将一个请求封装成一个对象,用不同的请求对客户端进行参数化。 3、应用举例 在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理。

【15、解释器模式】

1、作用 实现了一个表达式接口,该接口解释一个特定的上下文。 2、自我概括 给定一个语言,定义它的文法表示,定义一个解释器,这个解释器使用该标识来解释语言中的句子。对于一些固定文法构建一个解释句子的解释器。 3、应用举例 如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

【16、迭代器模式】

1、作用 用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 2、自我概括 提供一种方法顺序访问一个聚合对象中各个元素,而无须暴露该对象的内部标识。 3、应用举例 JAVA 中的 iterator

【17、中介者模式】

1、作用 用来降低多个对象和类之间的通信复杂性,提供一个中介类,处理不同类之间的通信。 2、自我概括 用一个中介对象来封装一系列的对象交互,中介者使对象不需要显式的相互引用。主要解决,对象之间存在大量的关联关系,若一个对象发生改变,我们需要跟踪处理与之对应的对象。 3、应用举例 系统中对象之间存在比计较复杂的引用关系,导致他们之间的依赖关系结构混乱难以复用。

【18、备忘录模式】

1、作用 保存一个对象的某个状态,以便在适当的时候回复对象。 2、自我概括 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 3、应用举例 后悔药,回滚

【19、观察者模式】

1、作用 当对象间存在一对多关系,当一个对象被修改时,会自动通知它的依赖对象。 2、自我概括 定义对象间一种一对多的依赖关系,当一个对象发生改变时,所有依赖它的对象都会得到通知并自动更新。 3、应用举例 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。

【20、状态模式】

1、作用 类的行为是基于它的状态改变的,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的对象。 2、自我概括 允许对象在内部状态发生改变时,改变它的行为,对象看起来好像修改了它的类。 3、应用举例 1、行为随状态改变而改变的场景。 2、条件、分支语句的代替者。

【21、空对象模式】

1、作用 一个空对象取代null对象实例的检查。 2、自我概括 null对象不是检查空值,而是反应一个不做任何动作的关系。这样null对象也可以在数据不可用时提供默认行为。 3、应用举例 null对象检查。

【22、策略模式】

1、作用 一个类的行为或其算法可以在运行时更改。
2、自我概括 我们创建表示各种策略的对象和一个行为随着策略对象改变的对象,动态的让一个对象在许多行为中选择一种行为的行为。 定义一些列的算法,把他们一个个封装起来,并且使它们可互相替换。 3、应用举例 一个系统有许多类,而区分他们的只是他们的直接行为。 旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。

【23、模板模式】

1、作用 一个抽象类公开定义了执行它的方法的模板,它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。 2、自我概述 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 3、应用举例 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。

【24、访问者模式】

1、作用 我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。 2、自我概述 将数据结构与数据操作分离,元素的执行算法随着访问者的改变而改变。 3、应用举例 对一个对象进行不同不相关操作。

【25、MVC模式】

1、MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。 2、这种模式用于应用程序的分层开发。 3、Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。 4、View(视图) - 视图代表模型包含的数据的可视化。 5、Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。

参考:《设计模式|菜鸟教程》 【业务代表模式】、【组合实体模式】、【数据访问对象模式】、【前端控制器模式】、【拦截过滤器模式】、【服务定位器模式】、【传输对象模式】略!