⾯向对象开发中的七⼤设计原则和23种设计模式
⼀、⾯向对象开发中的七⼤设计原则
  软件开发中最核⼼的思想就是“⾼内聚,低耦合”,主要的⽬的也是为了⽅便后期的维护和变更。下⾯的设计原则也是依靠这个核⼼思想衍⽣出来的。
  1、单⼀职责原则【SINGLE RESPONSIBILITY PRINCIPLE】:单⼀职责原则想表达的核⼼思想就是“⾼内聚”,⼀个模块只完成⼀项功能。在⾯向对象设计中,⼀个类只应该负责⼀项职责,如果同时承担太多职责,就等于把这些职责耦合在了⼀起。
    后⾯很可能因为某项职责的变更⽽导致其他职责的削弱或者抑制其他职责的能⼒。
  2、⾥⽒替换原则【LISKOV SUBSTITUTION PRINCIPLE】:任何时候都可以⽤⼦类型来替换⽗类型。
  3、依赖倒置原则【DEPENDENCE INVERSION PRINCIPLE】:⾯向接⼝编程,声明⽅法的参数类型、⽅法的返回类型、变量的引⽤类型时,尽可能使⽤抽象类型⽽不⽤具体类型,因为抽象类型可以被它的任何⼀个⼦类型所替代,请参考下⾯的⾥⽒替换原则。
  4、接⼝隔离原则【INTERFACE SEGREGATION PRINCIPLE】:建⽴单⼀接⼝,不要建⽴庞⼤臃肿的接⼝,尽量细化接⼝。
  5、迪⽶特法则【LOW OF DEMETER】:迪⽶特法则⼜叫最少知识原则,⼀个对象应当对其他对象有尽可能少的了解。(低耦合)
  6、开闭原则【OPEN CLOSE PRINCIPLE】⼀个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
  7、组合/聚合复⽤原则【Composition/Aggregation Reuse Principle(CARP) 】:尽量使⽤组合和聚合,少使⽤继承的关系来达到复⽤的原则。类与类之间简单的说有三种关系,IS-A关系、HAS-A关系、USE-A关系,分别代表继承、关联和依赖。
   其中,关联关系根据其关联的强度⼜可以进⼀步划分为关联、聚合和合成,但说⽩了都是HAS-A关系,合成聚合复⽤原则想表达的是优先考虑HAS-A关系⽽不是IS-A关系复⽤代码
⼆、23种设计模式
  设计模式是⼀套被反复使⽤的代码设计经验的总结,是对上⾯的设计原则的进⼀步细化,使⽤设计模式是为了可重⽤代码、让代码更容易被他⼈理解、保证代码可靠性。设计模式使⼈们可以更加简单⽅
便的复⽤成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。这23中设计模式概括起来可以分为三⼤类:
    1、创建型模式(5种):
      1.1、⼯⼚⽅法模式(factory method pattern):如果需要创建⼤量对象,并且这些类都实现了共同的接⼝,那么可以⽤⼯⼚⽅法模式来进⾏创建。
        ⼯⼚⽅法模式存在缺陷,由于对象的创建依赖⼯⼚的⽅法,如果需要创建新的类的实例,需要修改⼯⼚类的⽅法,这样违反了开闭原则。
      1.2、抽象⼯⼚模式(Abstract factory pattern):由于⼯⼚⽅法模式违反了开闭原则,那么我们就可以将⼯⼚也进⾏抽象,如果要创建新的类型的对象,就创建新的对应的⼯⼚类。这就是抽象⼯⼚模式,该模式的缺点是创建的类⽐较多。
      1.3、单例模式(Singleton pattern):单例对象能保证在⼀个JVM中,该类只有⼀个实例存在。
      1.4、建造者模式(Builder pattern):建造者模式⼜名创建者模式,是将⼀个复杂对象的构建过程与它的表⽰分离,从⽽使得相同的构建过程可以创建不同的表⽰;
        创建者模式隐藏了复杂对象的创建过程,它把复杂对象的构建加以抽象,通过⼦类继承或者重载的⽅式,动态的创建具有复合属性的对象。
      1.5、原型模式(prototype pattern):该模式的思想就是将⼀个对象作为原型,对其进⾏复制、克隆,产⽣⼀个和原对象类似的新对象。
    2、结构型模式(7种):
      2.1、适配器模式(Adapter pattern):将某个类的接⼝转换成客户端期望的另⼀个接⼝表⽰,⽬的是消除由于接⼝不匹配所造成的类的兼容性问题。
      2.2、装饰器模式(Decorator pattern):动态的为⼀个对象增加新的功能,要求装饰对象和被装饰对象实现同⼀个接⼝,装饰对象持有被装饰对象的实例。单例模式的几种实现方式
      2.3、代理模式(Proxy pattern):代理模式就是多⼀个代理类出来,替原对象进⾏⼀些操作,实际操作的还是原来的对象。就像明星的经纪⼈⼀样,经纪⼈就是明星的代理。
      2.4、外观模式(Facade pattern):也叫门⾯模式,为⼦系统中的⼀组接⼝提供⼀个⼀致的界⾯,定义⼀个⾼层接⼝,这个接⼝使得这⼀⼦系统更加容易使⽤。就像去公司⾯试或者拜访只需要前台就⾏,前台就算是公司的⼀个门⾯。
      2.5、桥接模式(Bridge pattern):桥接模式就是把事物和其具体实现分开,使他们可以各⾃独⽴的变化。
      2.6、组合模式(composite pattern):组合模式将对象组织到树结构中,可以⽤来描述整体与部分的关系。组合模式就是⼀个处理对象的树结构的模式。合成模式把部分与整体的关系⽤树结构表⽰出来。
        组合模式使得客户端把⼀个个单独的成分对象和由他们复合⽽成的合成对象同等看待。经典的例⼦就是部门树。
      2.7、享元模式(Flyweight Pattern):主要通过实现对象的共享来减少创建对象的数量,以减少内存占⽤和提⾼性能。如共享池,当系统中对象多的时候可以减少内存的开销,通常与⼯⼚模式⼀起使⽤。
    3、⾏为型模式(11种):
      3.1、策略模式(strategy pattern):策略模式针对⼀组算法,将每⼀个算法封装到具有共同接⼝的独⽴的类中,从⽽使得它们可以相互替换。策略模式把⾏为和环境分开。
        环境类负责维持和查询⾏为类,各种算法在具体的策略类中提供。由于算法和环境独⽴开来,算
法的增减,修改都不会影响到环境和客户端。
      3.2、模板⽅法模式(Template pattern):模板⽅法模式预备⼀个抽象类,在该抽象类的⽅法中只实现部分逻辑,然后声明⼀些抽象⽅法来迫使⼦类实现剩余的逻辑。
        不同的⼦类可以以不同的⽅式实现这些抽象⽅法,从⽽对剩余的逻辑有不同的实现。先制定⼀个顶级逻辑框架,⽽将逻辑的细节留给具体的⼦类来实现。
      3.3、观察者模式(observer pattern):让多个观察者对象同时监听某⼀个主题对象。这个主题对象在状态上发⽣变化时,会通知所有观察者对象,使他们能够⾃动更新⾃⼰。
      3.4、迭代器模式(iterator pattern):迭代器模式可以顺序访问⼀个聚集中的元素⽽不必暴露聚集的内部表象。多个对象聚在⼀起形成的总体称之为聚集,聚集对象是能够包容⼀组对象的容器对象。
        迭代器模式将迭代逻辑封装到⼀个独⽴的⼦对象中,从⽽与聚集本⾝隔开。迭代器模式简化了聚集的界⾯。每⼀个聚集对象都可以有⼀个或⼀个以上的迭代⼦对象,每⼀个迭代⼦的迭代状态可以是彼此独⽴的。迭代算法可以独⽴于聚集⾓⾊变化。
      3.5、责任链模式(Chain of responsibility pattern):在责任链模式中,很多对象由每⼀个对象对其下家的引⽤⽽接起来形成⼀条链。请求在这个链上传递,直到链上的某⼀个对象决定处理此请求。
        客户并不知道链上的哪⼀个对象终极处理这个请求,系统可以在不影响客户的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。⼀个请求可以终极不被任何接收端对象所接受。
      3.6、命令模式(Command pattern):命令模式把⼀个请求或者操作封装到⼀个对象中。命令模式把发出命令的责任和执⾏命令的责任分割开,委派给不同的对象。
        命令模式答应请求的⼀⽅和发送的⼀⽅独⽴开来,使得请求的⼀⽅不必知道接收请求的⼀⽅的接⼝,更不必知道请求是怎么被接收,以及操纵是否执⾏,何时被执⾏以及是怎么被执⾏的。系统⽀持命令的撤消。
      3.7、备忘录模式(Memento pattern):保存⼀个对象的某个状态,以便在适当的时候恢复对象。
      3.8、状态模式(State pattern):状态模式的意图是让⼀个对象在其内部状态改变的时候,其⾏为也随之改变。状态模式需要对每⼀个系统可能取得的状态创⽴⼀个状态类的⼦类。当系统的状态变化时,系统便改变所选的⼦类。
      3.9、访问者模式(visitor pattern):访问者模式的⽬的是封装⼀些施加于某种数据结构元素之上的操作。⼀旦这些操纵需要修改的话,接受这个操作的数据结构可以保持不变。
        访问者模式适⽤于数据结构相对未定的系统,它把数据结构和作⽤于结构上的操作之间的耦合解脱开,使得操作集合可以相对⾃由的演化。访问者模式使得增加新的操作变的很轻易,就是增加⼀个新的访问者类。
        访问者模式将有关的⾏为集中到⼀个访问者对象中,⽽不是分散到⼀个个的节点类中。当使⽤访问者模式时,要将尽可能多的对象浏览逻辑放在访问者类中,⽽不是放到它的⼦类中。
        访问者模式可以跨过⼏个类的等级结构访问属于不同的等级结构的成员类。
      3.10、中介者模式(Mediator pattern):也叫调停者模式,⽤来降低多个对象和类之间的通信复杂性。这种模式提供了⼀个中介类,该类通常处理不同类之间的通信,并⽀持松耦合,使代码易于维护。
      3.11、解释器模式(Interpreter pattern):定⼀个语⾔后,解释器模式可以定义出其⽂法的⼀种表⽰,并同时提供⼀个解释器。客户端可以使⽤这个解释器来解释这个语⾔中的句⼦。
        解释器模式将描述怎样在有了⼀个简单的⽂法后,使⽤模式设计解释这些语句。在解释器模式⾥⾯提到的语⾔是指任何解释器对象能够解释的任何组合。
         在解释器模式中需要定义⼀个代表⽂法的命令类的等级结构,也就是⼀系列的组合规则。每⼀
个命令对象都有⼀个解释⽅法,代表对命令对象的解释。
         命令对象的等级结构中的对象的任何排列组合都是⼀个语⾔。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。