zoukankan      html  css  js  c++  java
  • 设计模式总结

        历经n久,最终来总结设计模式了。设计模式的提出,把编程上升到了艺术的层面,就像建筑业,有规律、有模型,保证结构了稳定,然后在这个基础上发挥想象力,创造出令人惊叹的设计,编程亦是如此。以下回想一下设计模式的主要内容。

    六大原则

        单一职责:一个类,应该仅有一个引起它变化的原因。

        开放-封闭:对扩展开放,对改动封闭。

        依赖倒转:高层模块不应该依赖低层模块;抽象不应该依赖细节。

        里氏代换:子类能够替换它们的父类。

        迪米特法则:尽可能的降低与其它类的相互作用,即弱耦合。

        合成/聚合复用:尽量使用合成/聚合,不要使用继承。

    模式

      创建型

        单例:保证一个类仅仅有一个实例,而且在系统全局范围内提供訪问切入点。

            适用场合:各种“工厂类”。

        工厂:定义一个用户创建对象的接口,让子类去决定详细使用哪个类。

           适用场合:1)类不知道它所要创建的对象的类信息;2)类希望由它的子类来创建对象。

        抽象工厂:提供一个创建一系列相关或者相互依赖的对象的接口,而无须指定它的详细实现类。

           适用场合:1)系统不依赖于产品是怎样实现的细节;2)系统的产品族大于1,而在执行时刻仅仅须要某一种产品族;3)属于同一个产品族的产品,必须绑在一起使用;4)全部的产品族,能够抽取公共接口

        建造者:将复杂对象的构造与表示相分离,使得相同的构造过程能够产生不同的复杂对象。

           适用场合:1)须要创建的对象有复杂的内部结构;2)对象的属性之间相互依赖,创建时前后顺序须要指定。

        原型:用原型实例指定创建对象的种类,并通过复制原型实例得到对象。

           适用场合:1)系统不关心对象创建的细节;2)要实例化的对象的类型是动态载入的;3)类在执行过程中的状态是有限的。

      结构型

        适配器:将一个类的接口转换成用户希望的还有一个接口。

           适用场合:系统须要使用现有类的功能,但接口不匹配。

        装饰:动态的为对象加入额外职责。

           适用场合:1)须要加入对象职责;2)这些职责能够动态加入或者取消;3)加入的职责非常多,从而不能用继承实现。

        桥接:将抽象部分与实现部分分离,从而使得它们能够独立变化。

           适用场合:1)系统须要在组件的抽象化角色与详细化角色之间添加很多其它的灵活;2)角色的不论什么变化都不应该影响client;3)组件有多个抽象化角色和详细化角色。

        组合:将对象组装成树状结构以表示“部分-总体”的关系。

           适用场合:1)系统中的对象之间是“部分-总体”的关系;2)用户不关心“部分”与“总体”之间的差别。

        享元:运用共享技术支持大量细粒度的对象。

           适用场合:1)系统中有大量对象;2)这些对象占领大量内存;3)对象中的状态能够非常好的区分为外部和内部;4)能够依照内部状态将对象分为不同的组;5)对系统来讲,同一个组内的对象是不可分辨的。

        代理:为其它对象提供一种代理以控制对该对象的訪问。

           适用场合:对象无法直接訪问(远程代理)。

        外观:为系统的一组接口提供一个一致的界面。

           适用场合:1)为一个复杂的接口提供一个简单界面;2)保持不同子系统的独立性;3)在分层设计中,定义每一层的入口。

      行为型

        观察者:定义对象之间一种“一对多”的关系,当一个对象发生改变时,全部和它有依赖关系的对象都会得到通知。

           适用场合:1)抽象模型有两部分,当中一部分依赖于还有一部分;2)一个对象的改变会导致其它非常多对象发生改变;3)对象之间是松耦合訪问者。

        模板:定义一个操作步骤的方法骨架,而将当中一些细节的实现放到子类中。

           适用场合:1)能够抽取方法骨架;2)控制子类的行为,仅仅须要实现特定细节。

        命令:对一类对象公共操作的抽象。

           适用场合:1)调用者同一时候和多个运行对象交互;2)须要控制调用本身的生命周期;3)调用能够取消。

        状态:管理对象的多个状态。

           适用场合:1)对象的行为依赖于当前状态;2)业务处理过程存在多个分支,并且分支会越来越多。

        职责链:对目标对象实施一系列的操作,而且不希望调用两方和操作之间有耦合关系。

           适用场合:1)输入对象须要经过一系列处理;2)这些处理须要在执行时指定;3)须要向多个操作发送处理请求;4)这些处理的顺序是可变的。

        解释器:应用或对象与用户交互时,採取最具实效性的方式完毕。适

           用场合:1)针对对象的操作有规律可循;2)在运行过程中,对效率要求不高,但对灵活性要求非常高。

        中介者:避免大量对象之间的紧耦合。适用场合:1)有大量对象彼此依赖(M:N);2)某个类型要依赖于非常多其它类型。

        訪问者:对一组不同类型的元素进行处理。

           适用场合:1)一个类型须要依赖于多个不同接口的类型;2)须要常常为一个结构相对稳定的对象加入新操作;3)须要用一个独立的类型来组织一批不相干的操作,使用它的类型能够依据应用须要进行定制。

        策略:对算法族进行封装。

           适用场合:1)完毕某项业务有多个算法;2)算法可提取公共接口。

        备忘录:希望备份或者恢复复杂对象的部分属性。

           适用场合:1)对象的属性比較多,但须要备份恢复的属性比較少;2)对象的状态是支持恢复的。

        迭代器:提供一种方法, 来顺序訪问集合中的全部元素。

           适用场合:1)訪问一个聚合对象的内容,而不必暴露其内部实现;2)支持对聚合对象的多种遍历方式;3)为遍历不同的聚合对象提供一致的接口。

     

  • 相关阅读:
    Log4j的配置
    Linux笔记
    面对一个个路口
    切图布局知识点(四)——不定宽有背景文字块居中
    切图布局知识点(三)——左右布局
    切图布局知识点(二)——高度100%
    切图布局知识点(一)
    window下静默执行python脚本
    mysql 允许远程连接
    linux 防火墙
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4303115.html
Copyright © 2011-2022 走看看