设计模式

工作笔记 专栏收录该内容
18 篇文章 0 订阅
设计模式的六大原则
    总原则:开闭原则
        开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。
    单一职责原则
        不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分。
    里氏替换原则(Liskov Substitution Principle)
        任何基类可以出现的地方,子类一定可以出现
    依赖倒转原则(Dependence Inversion Principle)
        面向接口编程,依赖于抽象而不依赖于具体。
    接口隔离原则(Interface Segregation Principle)
        每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好
    迪米特法则(最少知道原则)(Demeter Principle)
        一个类对自己依赖的类知道的越少越好。也就是说无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。
    合成复用原则(Composite Reuse Principle)
        尽量首先使用合成/聚合的方式,而不是使用继承。



设计模式分类
        创建型:creational 与对象的创建有关。 
        结构型:Structural 处理类或对象之间的组合。 
        行为型:behavioral 描述类或对象如何交互及如何分配职责。



创建模式
    工厂方法模式
        特点
            使用工厂类的方法创建对象,返回值为接口或父类,在方法中根据条件返回不同的子类对象
            工厂类也是根据接口生成,当需要添加新的业务实现类时,先添加新的工厂类(不用修改原来的工厂方法)
        优点
            添加新的类非常方便,无需修改原来的代码,只添加新的类即可
        举例
            汽车工厂生产不同型号的汽车,我们不关心内部制造过程
    抽象工厂模式
        特点
            围绕一个超级工厂创建其他工厂,解决接口选择问题.
        优点
            提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.可始终生产同一产品族的产品
    单例模式
        特点
            只有一个实例
        优点
            节省内存和提高效率, 统一管理
        举例
            class对象
            hibernate中的session
    建造者模式
        特点
            将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
            (将一个复杂的类分为许多实现部分单一功能的类,然后将单一功能的类进行组装)
        优点
            方便重用,结构清晰
        举例
            单品和套餐
    原型模式
        特点
            克隆产生一个对象,而不是直接创建一个对象,主要应用与那些创建新对象的成本过大时
        优点
            提高性能. 逃避构造函数的约束
        举例
            码农-搬运代码
        实现
            浅表复制:实现接口,调用Object的clone方法
            深度复制:对象序列化,写入再读出



结构模式
    适配器模式
        特点
            利用现有类的全部或一部分功能,经过组装扩展,可实现其它的功能
            或想使用现有的类实现某些功能,但需要对现有的类进行扩展
        优点
            可重用现有类的功能
        举例
            110V+电源适配器-->220V, 内存卡+读卡器-->u盘, 马+驴-->骡子
    桥接模式
        特点
            实现系统可能有多个角度分类,每一种角度都可能变化,用继承会造成类爆炸问题,扩展起来不灵活
            将复杂的情况分为多个独立变化的量,将每个量分为一个类,多个类可组合为所有的情况(8=2*2*2)
            将抽象化与实现化解耦,使得二者可以独立变化(在抽象化时不必考虑实现时的众多情况,每个变化量定义为一个接口即可)
        优点
            将继承关系转化成关联关系,封装了变化,完成了解耦,减少了系统中类的数量
        举例
            jdbc
            构造一个对象需要在构造函数中指定其它三个对象,通过配置获得不同的对象
    组合模式
        特点
            将对象组合成树形结构以表示“部分-整体”的层次结构, 并实现一样的接口统一操作
            树状结构,功能一致,采用类A中存在List<A>属性的方式,可进行迭代(递归)操作
        优点
            统一地使用组合结构中的所有对象
        举例
            文件,文件夹
    装饰者模式
        特点
            使用另一个对象装饰一个对象,装饰对象实现和被装饰对象一样的接口,装饰对象持有被装饰对象的实例,调用的是装饰的方法,可对被装饰对象的方法进行增强
        优点
            不用实现继承即可对方法进行增强
        缺点
            需要实现接口所有方法
        举例
            在过滤器中对request的getParameter方法进行增强,解决get乱码问题
    外观模式
        特点
            为子系统中的一组接口提供一个一致的界面(一个转发类,帮助处理内部逻辑)
            该类提供了客户端请求的简化方法和对现有系统类方法的委托调用
            降低访问复杂系统的内部子系统时的复杂度,简化客户端访问的接口
        优点
            用户调用方便,客户端和系统不耦合
        举例
            System类提供了几个Runtime类的便捷方法(exit,gc)
    享元模式
        特点
            重用现有对象,减少对象的创建
        优点
            减少内存占用,效率高
        举例
            String,数据库连接池
    代理模式
        特点
            使用另一个对象代理一个对象,外层对象实现和被代理对象一样的接口,先调用的是外层对象的方法,可控制权限或改变内部方法运行时间(懒加载)
        优点
            职责清晰,高扩展
        和装饰者模式的区别
            装饰者主要用来增强方法,而代理是进行一些控制,如权限和懒加载
        举例
            hibernate懒加载



行为型模式
    责任链模式
        特点
            将多个可能的任务分为多个处理环节并组成一个链,每个环节的处理类实现同样的接口,并包含对下一个环节的引用(可动态指定),总是从链条头部开始执行
        优点
            降低耦合度,可方便修改或增加新的处理环节
        举例
            java异常机制,js事件冒泡,struts拦截器
    命令模式
        特点
            将一组行为抽取一个固定的接口,使用参数控制不同的行为
        优点
            可进行统一操作,降低系统耦合度,添加新行为很方便
        举例
            url通过拦截器进行分发
    解释器模式
        特点
            用来解析某种语法的文本,编写实现类,规定每个标识符该执行的操作
        优点
            扩展性好
        举例
            表达式引擎
    迭代器模式
        特点
            提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示
        优点
            简化了聚合类,符合单一职责原则
        举例
            Iterator
    中介者模式
        特点
            使用一个中介对象来封装一系列对象的交互,使各对象不需要显式的互相引用,将多对多分离为一对多
        优点
            低耦合
        举例
            mvc,数据库使用中间表将多对多拆分为一对多
    备忘录模式
        特点
            存储对象的某些状态,可在后来进行恢复.使用单独的管理类来保存对象的状态
        优点
            可回退
        举例
            游戏存档
    观察者模式
        特点
            当一个对象被修改时,自动通知其它对象.在对象中存在List,保存着需要通知的对象,需要通知的对象实现统一接口,当属性修改时,遍历调用需要观察者的方法
        优点
            解耦,可方便添加和删除观察者
    状态模式
        特点
            对象的行为依赖于对象的状态,当对象状态不同时可进行不同的操作
            将不同的状态提取为不同的类,实现不同的行为,状态需要进行枚举(可用于消除if.else)
        优点
            枚举所有的状态
    策略模式
        特点
            枚举所有的解决问题的方法(策略),处理时选取对应的策略(可减少if.else)
        优点
            可自由切换策略,减少if.else
    模板方法模式
        特点
            父类定义流程或大框架(final),子类重写具体细节,完成特定任务
        优点
            封装不变部分,扩展可变部分.行为由父类控制,子类实现
    访问者模式
        特点
            对象的行为由访问者来决定,对象本身只存储数据,而访问者来定义数据的行为
        优点
            数据和行为相分离,扩展性强
        缺点
            对象向访问者公布细节,违反迪米特原则
        示例
            看病(向医生提供自己的信息,医生来决定怎么做)


  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

qq1123734918

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值