设计模式之总结(三)


一、单一职责原则(SingleResponsibility Principle,SRP)

        类的职责要单一,不能将太多的职责放在一个类中。(高内聚、低耦合)

优点:

        1、降低类的复杂性,类的职责清晰明确。比如数据职责和行为职责清晰明确。

        2、提高类的可读性和维护性,

        3、变更引起的风险减低,变更是必不可少的,如果接口的单一职责做得好,一个接口修改只对相应的类有影响,对其他接口无影响,这对系统的扩展性、维护性都有非常大的帮助。

        注意:单一职责原则提出了一个编写程序的标准,用“职责”或“变化原因”来衡量接口或类设计得是否合理,但是“职责”和“变化原因”都是没有具体标准的,一个类到底要负责那些职责?这些职责怎么细化?细化后是否都要有一个接口或类?这些都需从实际的情况考虑。因项目而异,因环境而异

二、开闭原则(Open - ClosedPrinciple ,OCP )

        对扩展开放,对修改关闭(设计模式的核心原则

        一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。但并不意味着不做任何修改,低层模块的变更,必然要有高层模块进行耦合,否则就是一个孤立无意义的代码片段。
 
        优点:
        1.单元测试更加方便,而不影响现有逻辑
        2.提高代码的复用性。
        3.提高可维护性。
        4.面积对象开发的要求。

三、里氏代换原则( LiskovSubstitution Principle ,LSP )

        只要父类能出现的地方子类都可以出现,而且替换为子类也不会产生任何错误或异常,使用者可有根本就不需要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必能适应。

        优缺点:

        在面向对象的语言中,继承是必不可少的、非常优秀的语言机制,它有如下优点:

        1)代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;

        2)提高代码的重用性;

        3)子类可以形似父类,但又异于父类,“龙生龙,凤生凤,老鼠生来会打洞”是说子拥有父的“种”,“世界上没有两片完全相同的叶子”是指明子与父的不同;

        4)提高代码的可扩展性,实现父类的方法就可以“为所欲为”了,君不见很多开源框架的扩展接口都是通过继承父类来完成的;

        5)提高产品或项目的开放性。

 

        自然界的所有事物都是优点和缺点并存的,即使是鸡蛋,有时候也能挑出骨头来,继承的缺点如下:

        1)继承是侵入性的。只要继承,就必须拥有父类的所有属性和方法;

        2)降低代码的灵活性。子类必须拥有父类的属性和方法,让子类自由的世界中多了些约束;

        3)增强了耦合性。当父类的常量、变量和方法被修改时,必需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能带来非常糟糕的结果——大片的代码需要重构。

四、依赖倒转原则( DependenceInversion Principle ,DIP )                        

         含义:
        1.高层模块不应该依赖低层模块,两者都应该依赖其抽象。
        2.抽象不应该依赖细节。
        3.细节应该依赖抽象。

        优点:采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。

五、合成/聚合复用原则(Composite/Aggregate ReusePrinciple ,CARP)

        要尽量使用对象组合,而不是继承关系达到软件复用的目的

 比较:

        (1)合成/聚合复用
                ① 优点:
                         新对象存取成分对象的唯一方法是通过成分对象的接口;
                         这种复用是黑箱复用,因为成分对象的内部细节是新对象所看不见的;
                         这种复用支持包装;
                         这种复用所需的依赖较少;
                         每一个新的类可以将焦点集中在一个任务上;
                         这种复用可以在运行时动态进行,新对象可以使用合成/聚合关系将新的责任委派到合                        适的对象。
                ② 缺点:
                        通过这种方式复用建造的系统会有较多的对象需要管理。
        (2)继承复用
                ① 优点:
                          新的实现较为容易,因为基类的大部分功能可以通过继承关系自动进入派生类;
                          修改或扩展继承而来的实现较为容易。
                ② 缺点:
                          继承复用破坏包装,因为继承将基类的实现细节暴露给派生类,这种复用也称为白箱                        复用;
                          如果基类的实现发生改变,那么派生类的实现也不得不发生改变;
                          从基类继承而来的实现是静态的,不可能在运行时发生改变,不够灵活。

六、迪米特法则(Law ofDemeter,LoD)

        系统中的类,尽量不要与其他类互相作用,减少类之间的耦合

含义:
        1.只和朋友交流(出现在成员变量、方法的输入输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友类)
        2.朋友间也是有距离的。(类尽量不要对外公布太多的public方法和非静态的public变量,尽量内敛,多使用private、protected等访问权限)
        3.是自己的就是自己的。
        4.谨慎使用Serializable。


优点:

        <1>迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。
        <2>遵循迪米特法则会使一个系统的局部设计简化,因为每一个局部都不会和远距离的对象有直接关联


缺点:
        <1>会在系统里造出大量的小方法,散落在系统的各个角落。这些方法仅仅是传递间接的调用,因此与系统的商务逻辑无关,当设计师试图从一张类图看出总体的框架时,这些小的方法会造成迷惑和困扰。
        <2>会造成系统的不同模块之间的通信效率降低,也会使系统的不同模块之间不容易协调。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值