首页 > 其他 > 详细

设计模式笔记

时间:2018-09-21 10:01:54      阅读:175      评论:0      收藏:0      [点我收藏+]

大话设计模式笔记

总结

  • 面对对象
    • (可维护) 改动时只改需要改动的地方
    • (可复用)
    • (可扩展) 以后加入需求不需要改动原来的代码
    • (灵活性) 功能可以满足很多情况
  • 重复 = 易错 + 难改

设计模式

技术分享图片

  • 创建型 (Gof Creational Patterns)
    • Factory Method(工厂方法)
    • Abstract Factory(抽象工厂)
    • Builder(建造者)
    • Prototype(原型)
    • Singleton(单例)
  • 结构型 (Gof Structural Patterns)
    • Adapter Class/Object (适配器)
    • Bridge (桥接)
    • Composite (组合)
    • Decorator (装饰)
    • Facade (外观)
    • Flyweight (享元)
    • Proxy (代理)
  • 行为型 (Gof Behavioral Patterns)
    • Interpreter (解释器)
    • Template Method (模板方法)
    • Chain of Responsibility (责任链)
    • Command (命令)
    • Iterator (迭代器)
    • Mediator (中介者)
    • Memento (备忘录)
    • Observer (观察者)
    • State (状态)
    • Strategy (策略)
    • Visitor (访问者)

工厂模式(Factory Method)

此模式定义了用于创建对象的接口,但允许子类决定实例化哪个类。 它允许类将实例化延迟到子类。

一个实例化时需要做点初始化工作, 这些工作可能与此类无关,而与业务有关.所以实现代码不要再类种, 而且同时有多个类似的类.
这个时候就用一个工厂类, 将创建实例与使用实例分开. (具体事情做得越多,越容易犯错误)

由于实例化延迟到了子类, 所以改动会修改客户端的实例化代码. 这个时候利用反射 解决分支判断.

策略模式(Strategy)

此模式定义了一系列算法,将每个算法封装起来并使它们可互换。 它允许算法独立于使用它的客户端。

定义一系列算法的方法, 所有这些算法完成相同的工作, 但是实现不同, 它们可以以相同的方式调用所有算法, 减少各种算法类与使用算法类之间耦合

装饰模式(Decorator)

此模式将附加职责附加到对象,动态地为子类化提供灵活的替代,以扩展功能。

动态的给一个对象添加一些二外的职责, 就增加功能来说, 装饰模式比生成子类更灵活.

代理模式(Proxy)

此模式为另一个对象提供代理或占位符以控制对它的访问。

  • 代理模式的应用
    • 远程代理. 为一个对象再不同的地址空间提供局部代表. 这样可以隐藏一个对象存在于不同的地址空间的事实.
    • 虚拟代理. 根据需要创建开销很大的对象. 通过它来存放实例化需要很长时间的真实对象. 比如HTML网页里很多文字和图片. 就是通过虚拟代理来代替真实的图片, 此时代理存储了真实图片的路径和尺寸.
    • 安全代理. 用来控制真实对象访问时的权限.
    • 智能指引. 指当调用真实的对象时, 代理处理另一些事情. 比如计算对象引用次数, 没有引用时自动释放,

原型模式(Prototype)

此模式指定使用原型实例创建的对象类型,并通过复制此原型来创建新对象。

模板方法模式(Template Method)

此模式定义操作中算法的框架,将一些步骤推迟到子类。 它允许子类重新定义算法的某些步骤而不改变算法的结构。

当我们要完成某以细节层次一致的过程或步骤, 但是=个别步骤再更详细的层次上实现可能不同时, 通常考虑模板方法模式来处理

外观模式(Facade)

此模式为子系统中的一组接口提供统一接口。 它定义了一个更高级别的接口,使子系统更易于使用。

建造者模式(Builder)

此模式将复杂对象的构造与其表示分开,以便相同的构造过程可以创建不同的表示。

主要用于创建一些复杂的对象, 这些对象内部构建间的顺序通常是稳定的, 但对象内部的构建通常面临复杂的变化.
比如收银台的结算过程: 统计订单结算金额 -> 统计订单积分 -> 增加商品销售记录 -> 扣除会员余额,增加会员积分. 这个过程是稳定的, 但是统计积分的实现等都可能变化

观察者模式(Observer)

此模式定义对象之间的一对多依赖关系,以便当一个对象更改状态时,将自动通知和更新其所有依赖项。

抽象工厂(Abstract Factory)

提供一个创建一系列相关或相互依赖对象的接口, 而无需指定它们具体的类


六大原则

开放-封闭原则(Open Close Principle)(OCP)

软件实体(类, 模块, 函数等)应该可以扩展, 但是不可修改.

开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类。

里氏代换原则(Liskov Substitution Principle)(LSP)

软件实体如果使用的是一个父类, 那么一定适用于其字类, 而且它察觉不出父类对象和字类对象的区别. 也就是说, 再软件里面, 把父类都替换成它的子类, 程序的行为没有变化. (子类型必须能够替换掉他们的父类型)

LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用. 里氏代换原则是对“开放-封闭”原则的补充. 实现“开放-封闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范

依赖倒转原则(Dependence Inversion Principle)(DIP)

A. 高层模块不应该依赖底层模块. 两个都应该依赖抽象.

B. 抽象不应该依赖细节. 细节应该依赖与抽象

比如: 开发时候为了复用, 把常用代码写成许多函数库, 项目要访问数据库时, 访问数据库的代码就写成函数, 这样高层就依赖了底层模块.
但是如果做新项目时, 发现业务逻辑的高层模块都是一样的, 但是客户希望使用不同的数据库或存储方式. 这时候就没法复用高层模块了, 应该它们依赖与底层模块. 就像CPU, 内存都依赖于主板, 主板坏不能所有部件都没用, 反过来内存坏了也不应该导致其他部件不能用. 所以都应该依赖抽象, 只要接口是稳定的, 那么就不用担心.

接口隔离原则(Interface Segregation Principle)(ISP)

使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合

迪米特法则(Demeter Principle)(DP)

最少知道原则.一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立

如果两个类不必彼此直接通信, 那么这两个类就不应当发生直接的互相作用. 如果其中一个类需要调用另一个类的某一方法, 可以通过第三者转发这个调用

合成复用原则(Composite Reuse Principle)(CRP)

尽量使用合成/聚合的方式,而不是使用继承


脚注

大话设计模式
GOF23种设计模式精解
利用反射和策略模式解决大量switch case

设计模式笔记

原文:https://www.cnblogs.com/xueyoucd/p/9684896.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!