设计模式总纲领
2021-01-11 11:38:35 0 举报
AI智能生成
设计模式全解,23种设计模式,从作用到使用到优点都说明
作者其他创作
大纲/内容
面向对象的设计的基本原则
单一职责原则
一个类,最好只做一件事,只有一个引起它的变化
里氏替换原则
子类可以代替换父类,而父类不可以替换子类
依赖倒置原则
要针对借口编程,不要针对实现编程
迪米特法则
只与你直接的朋友通信,而避免和陌生人通信
开放封闭原则
一个软件的实体应当对扩展开放,对修改关闭
接口隔离原则
使用多个小的专门的接口,而不要使用一个大的总接口。就是每一个接口都执行一个专门的功能,用什么调什么
组合/聚集复用原则
聚合表示整体与部分的关系,表示“含有”,整体由 部分组合而成,部分可以脱离整体作为一个独立的个体存在。组合则是一种更强的聚合,部 分组成整体,而且不可分割,部分不能脱离整体而单独存在
设计模式的基本原则
找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起
创建型模式
单例模式
作用
保证一个类只有一个对象,并且提供一个访问改实例的全局访问点
优点
1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)
2、避免对资源的多重占用(比如写文件操作)
何时使用
当您想控制实例数目,节省系统资源的时候
常见应用场景
Windows的Task Menager
windows的Recycle Bin(回收站)
项目中读取配置的类,每次只能new一个区读外部配置
网站的访问情况,比如统计人数
数据库连接池
实例
主要
饿汉式(线程安全,调用效率高,不能延时加载)
分支主题
懒汉式(线程安全,调用效率不高,可以延时加载)
分支主题
其他
双重检测锁式(由于JVM底层内部模式原因,偶尔会出现问题,不建议使用)
静态内部式(线程安全,调用效率高,可以延时加载)
枚举式(线程安全,调用效率高,不能延时加载
创建三步曲
1,私有的静态创建实例
2,私有的构造器
3,向外部提供一个共有的静态的获取实例的方法
工厂模式
作用
定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
何时使用
我们明确地计划不同条件下创建不同实例时
优点
1、一个调用者想创建一个对象,只要知道其名称就可以了
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以
3、屏蔽产品的具体实现,调用者只关心产品的接口。
实例
简单工厂
分支主题
工厂方法
分支主题
抽象工厂模式
作用
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
何时使用
系统的产品有多于一个的产品族,而系统只消费其中某一族的产品
优点
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
实例
分支主题
建造者模式
场景
比如说构建一个完整的物品的时候,他由很多个小组件组成,组装的过程中有一个过程,这个过程叫装配
作用
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
何时使用
一些基本部件不会变,而其组合经常变化的时候
优点
1、建造者独立,易扩展
2、便于控制细节风险
实例
原型模式
场景
克隆技术的过程是怎么样的?克隆 的过程就叫做原型
本质
通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式
何时使用
1、当一个系统应该独立于它的产品创建,构成和表示时
2、当要实例化的类是在运行时刻指定时,例如,通过动态装载
3、为了避免创建一个与产品类层次平行的工厂类层次时
4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
优点
1、性能提高
2、逃避构造函数的约束
实例
浅复制
分支主题
深复制
分支主题
分支主题
序列化复制
分支主题
结构型模式
适配器模式
作用
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
何时使用
1、系统需要使用现有的类,而此类的接口不符合系统的需要
2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口
3、通过接口转换,将一个类插入另一个类系中
优点
1、可以让任何两个没有关联的类一起运行
2、提高了类的复用
3、增加了类的透明度
4、灵活性好
实例
分支主题
桥接模式
作用
将抽象部分与实现部分分离,使它们都可以独立的变化
何时使用
实现系统可能有多个角度分类,每一种角度都可能变化
优点
1、抽象和实现的分离
2、优秀的扩展能力
3、实现细节对客户透明
实例
分支主题
装饰模式
作用
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活
何时使用
在不想增加很多子类的情况下扩展类
优点
装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能
实例
分支主题
组合模式
作用
将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
何时使用
1、您想表示对象的部分-整体层次结构(树形结构)
2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象
优点
1、高层模块调用简单
2、节点自由增加
实例
分支主题
外观模式
作用
为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
何时使用
1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可。
2、定义系统的入口。
优点
1、减少系统相互依赖。
2、提高灵活性。
3、提高了安全性。
实例
分支主题
享元模式
作用
运用共享技术有效地支持大量细粒度的对象。
何时使用
1、系统中有大量对象。
2、这些对象消耗大量内存。
3、这些对象的状态大部分可以外部化。
4、这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。
5、系统不依赖于这些对象身份,这些对象是不可分辨的。
优点
大大减少对象的创建,降低系统的内存,使效率提高。
实例
分支主题
代理模式
作用
为其他对象提供一种代理以控制对这个对象的访问
何时使用
想在访问一个类时做一些控制
优点
1、职责清晰
2、高扩展性
3、智能化
实例
静态代理
分支主题
动态代理
分支主题
行为型模式
模板方法模式
作用
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
何时使用
有一些通用的方法。
优点
1、封装不变部分,扩展可变部分。
2、提取公共代码,便于维护。
3、行为由父类控制,子类实现。
实例
分支主题
命令模式
作用
将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
何时使用
在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
优点
1、降低了系统耦合度。
2、新的命令可以很容易添加到系统中去。
实例
分支主题
迭代器模式
作用
提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
何时使用
遍历一个聚合对象。
优点
1、它支持以不同的方式遍历一个聚合对象。
2、迭代器简化了聚合类。
3、在同一个聚合上可以有多个遍历。
4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
实例
分支主题
观察者模式
作用
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
何时使用
一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
优点
1、观察者和被观察者是抽象耦合的。
2、建立一套触发机制。
实例
分支主题
分支主题
中介者模式
作用
用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
何时使用
多个类相互耦合,形成了网状结构。
优点
1、降低了类的复杂度,将一对多转化成了一对一。
2、各个类之间的解耦。
3、符合迪米特原则。
开发常见场景
MVC模式(其中的C,控制器就是一个中介者,M和V都和它打交道))
窗口游戏程序,窗口软件开发中窗口对象也是一个中介者对象
java.lang.reflect.Method#invoe()
实例
分支主题
备忘录模式
作用
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
何时使用
很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。
优点
1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
2、实现了信息的封装,使得用户不需要关心状态的保存细节。
实例
分支主题
状态模式
作用
允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
何时使用
代码中包含大量与对象状态有关的条件语句。
优点
1、封装了转换规则
2、枚举可能的状态,在枚举状态之前需要确定状态种类
3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为
4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块
5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数
实例
分支主题
策略模式
作用
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
何时使用
一个系统有许多许多类,而区分它们的只是他们直接的行为。
优点
1、算法可以自由切换。
2、避免使用多重条件判断。
3、扩展性良好。
实例
分支主题
责任链模式
作用
避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
何时使用
在处理消息的时候以过滤很多道。
优点
1、降低耦合度。它将请求的发送者和接收者解耦。
2、简化了对象。使得对象不需要知道链的结构。
3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
4、增加新的请求处理类很方便。
实例
分支主题
分支主题
访问者模式
作用
主要将数据结构与数据操作分离。
何时使用
需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些封装到类中
优点
1、符合单一职责原则
2、优秀的扩展性
3、灵活性
实例
不会用到
解释器模式
作用
给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。
何时使用
如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。
这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
优点
1、可扩展性比较好,灵活。
2、增加了新的解释表达式的方式。
3、易于实现简单文法。
实例
不会用到
0 条评论
下一页
为你推荐
查看更多