OO设计模式简介

OO设计原则:主要介绍了如下几个原则

SRP, Single Responsibility Principle
OCP, Open-Closed Principle
LSP, Liskov Substitution Principle
DIP, Dependency Inversion Principle
ISP, Interface Segregation Principle
CARP, Composition/Aggregation Principle
LoD, Law of Demeter

 在软件开发中唯一不变的就是变化。任何系统在其生命周期中都会发生变化。如果我们希望开发出的系统不会在第一版本后就被抛弃,那么我们就必须牢牢记住这一点。
 软件领域模块设计知道原则:
  High cohesion,Low coupling 高内聚,低耦合。
目前OO的设计的原则主要有以下几类:
 <1>.SRP,Single Responsibility Principle  单一职责原则(高内聚)
  对一个类而言,应该仅有一个引起它变化的原因。
  需求的变化就是功能的变化;反映到类上就是职责变化,如果一个类的职责过多,那么这些职责就会互相依赖,一个职责的变化可能会影响到另一个职责的履行。其实OOD实质就是合理地进行类地职责分配。
 <2>.OCP,Open-Closed Principle 开闭原则
  Software entities should be open for extension,but closed for modification
  是OO设计地第一原则。它因该对拓展是开放地,但是对修改应该是关闭地。即我地软件行为可以被扩展,但是我的软件不能被修改。
 <3>.LSP,Liskov Substitution Principle 里氏代换原则
  If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behaviour of P is unchanged when o1 is substituted for o2 then S is a subtype of T.
           — Barbara Liskov

 里氏代换原则:若对于每一个类型S的对象o1,都存在一个类型T的对象o2,使得在所有针对T编写得程序P中,用o1替换o2后,程序P的行为功能不变,则S是T的子类型。
 换句话说:任何基类出现得地方,子类一定可以出现。由父类承担得职责,子类一定可以承担,反之不行。

 <4>.DIP,Dependency Inversion Principle 依赖倒转原则

 a.High-level modules should not depend on low-level modules.Both should depend on abstractions
 b.Abstractions should not depend on details.Detils should depend on abstractions.

 要以来于抽象,不要依赖于具体。高层的模块不要依赖于底层的模块,都要依赖于抽象。(可以理解为在企业中只依赖于规则,而不依赖于老板,这样能实现即使没有老板,公司也照样运行,如果老本没了公司就跨了,那么就是失败的。)

        Program to an interface,not an implementation

 针对接口编程,而不要面向实现变成,注意这里的接口不是java里的接口类

 DIP原则是Framework设计的核心原则 OCP是目标,DIP是实现目标的方法

 依赖即耦合:零耦合(不相关的类),具体耦合(一个类改了之后另一类必须改(方法调用关系),这种耦合是良性的.但是在子类里面调用父类的方法,不是良性的。父类功能变换影响了子类的功能。正确方法是子类可以重写父类方法),抽象耦合(有实现关系的耦合)。

 Dip原则谑称"好莱坞原则":Hollywood Principle ,Don't call us,we'll call you.即依赖倒转。这种依赖是需要时才建立,即这种依赖是动态的而不是静态的。

 控制反转:IOC Inversion of Control
 依赖驻入:Dependency Injection
 Martin Flower

 <5>.ISP,Interface Segregation Principle 接口隔离原则ISP
 接口隔离原则ISP:不应该强迫客户依赖于他们不用的方法,接口属于客户,不属于它所在的类层次结构。(例如继承使,子类继承了父类的所有方法,但有的方法子类不需要,是被父类强迫的。)接口里的方法要尽可能少。大的接口可以分割成小接口。但是工具类可以实现多个方法。越多越好。
 
 <6>.CARP,Composition/Aggregation Principle 组合/聚合复用原则
 组合/聚合复用原则CARP:在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用自己的目的。另一种说法:Favor Composition over Inheritance  尽量使用类的组合复用,尽量不要使用继承复用。
 组合要比继承好的多。
 组合和聚合的区别:组合关系紧密性强于聚合关系,组合意味着生命周期相同,而聚合不一定。
 注意在多个小对象组合成一个大对象,在销毁时一定要把其它的对象也销毁。

 <7>.LoD,Law of Demeter  迪米特法则
 又叫做最少知识原则:Least Knowledge Principle,LKP:一个对象应当对其他对象有尽可能少的了解。迪米特法则要求任何一个软件实体,除非绝对需要,不然不要与外界通信。即使必须进行通信,也应当尽量限制通信的广度和深度 

如果读者感兴趣,可以参看我的博客上的java培训笔记五,在里面用java语言编写了一个应用上面法则的简单的例子。是一个很简单但又很有代表性的例子。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值