zoukankan      html  css  js  c++  java
  • 23种设计模式

    23种设计模式:
    1、简单工厂模式
    2、策略模式
    3、装饰者模式
    4、代理模式
    5、工厂模式
    6、原型模式
    7、模板模式
    8、外观模式
    9、建造者模式
    10、观察者模式
    11、抽象工厂模式
    12、状态模式
    13、适配器模式
    14、备忘录模式
    15、组合模式
    16、迭代器模式
    17、单例模式
    18、桥接模式
    19、命令模式
    20、职责链模式
    21、中介者模式
    22、享元模式
    23、解释者模式
    24、访问者模式

    设计模式六大原则:
    1、单一职责原则:单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。
    2、开放封闭原则:对于扩展是开放的,对于修改是封闭的。无论模块是多么的"封闭",都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化。开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象,然而,对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。
    3、依赖倒转原则:抽象不应该依赖细节,细节应该依赖于抽象,说白了就是要针对接口编程,依赖抽象或接口编程。
    4、里氏替换原则:只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正的被复用,而子类也能够在父类的基础上增加新的行为。
    里氏替换原则:父类引用指向子类对象Person p=new Chinese();(隐式类型转换)
    里氏替换原则:定义一个方法的时候,返回类型是父类型,而实际返回是子类型的对象
    5、迪米特法则(最少知识原则):如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用,强调的前提是在类的结构设计上,每一个类都应当尽量降低成员的访问权限。也就是说,一个类包装好自己的private状态,不需要让别的类知道的字段或行为就不要公开,其根本思想是强调了类之间的松耦合。
    6、合成复用原则

    原则是尽量首先使用合成/聚合的方式,而不是使用类继承。

    简单工厂模式:
    专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。它又称为静态工厂方法模式。
    它的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例
    适用范围:工厂类负责创建的对象比较少,客户只知道传入了工厂类的参数,对于始何创建对象(逻辑)不关心。

    工厂方法模式:在工厂和产品中间增加接口,工厂不再负责产品的创建,由接口针对不同条件返回具体的类实例,由具体类实例去实现


    抽象工厂:抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象,如果有新的对象实体,通过反射动态的创建对象实例,用户不需要打开项目改代码,只需要在配置文件中改就好,这样更灵活

    适用范围:用来生产不同产品族的全部产品,比如每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品

    相同点:

    1、提高了程序的可维护性和低耦合性
    2、都是为客户调用程序与具体的对象类型之间提供了一个解耦作用,就是说应用程序不关心这个对象是怎么出来的,只关系如何使用这个对象,而且以后就算对象发生变化,那么也不需要修改用户应用程序的代码。

    观察者模式:有时又被称为发布-订阅模式,完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。

    项目中哪里用到简单工厂和抽象工厂?
    搭建框架时,简单工厂发现根据不同的实体还是要改代码,于是抽象出一个抽象工厂类,把变化的对象放入配置文件中,通过反射动态获取一个实例

    项目中哪里用到观察者模式?
    日志出现错误信息后,而写信息可能写到不同地方去(比如写到文件、数据库里面去),第二同时可能写到多个地方去,
    最后我用了两种方式实现,一个用多播委托很容易就实现,另外一个我用面向对象的思想实现的,我定义一个接口ILog,
    接口中定义一个写日志的方法,如果写到文本文件中,就让他实现接口并实现接口中的方法,如果写到数据库中去,
    也让他实现接口并实现接口中的方法,然后定义一个list集合,类型为ILog,直接将文本文件的类、sql的类加到list集合中去
    最后遍历list集合,调用写日志的方法就可以了。

  • 相关阅读:
    某大神C#框架后台发送信息的查找及破解
    多平台下Modbus通信协议库的设计(一)
    wpf 窗口程序下将datagrid导出为excel
    luogu P2598 [ZJOI2009]狼和羊的故事 |网络流最小割
    luogu P3171 [CQOI2015]网络吞吐量 |网络流最大流
    luogu P2469 [SDOI2010]星际竞速 |网络流费用流
    luogu P2172 [国家集训队]部落战争 |网络流最少路径覆盖
    luogu P2045 方格取数加强版 |最大费用最大流
    luogu P6327 区间加区间sin和 |线段树
    luogu P2402 奶牛隐藏 |网络流最大流+二分
  • 原文地址:https://www.cnblogs.com/xiaoweigogo/p/7794000.html
Copyright © 2011-2022 走看看