面向对象设计原则


1、单一职责原则

一个对象只包含单一职责,并且该职责被完整的封装在一个类中。

这里包含两层意思:

第一层:一个类只包含一个单一功能。如负责创建对象的类,就只负责对象的创建,而至于对象的使用,管理等功能交由其他类去实现。

第二层:一个类负责的特定的某一职责只在这个类中实现,而不要在多处实现,并且该类能独立的处理自己负责的职责,而无需借助其他类。如负责创建某一个类A的对象的类B,则这个类A的所有对象创建都应该由类B来创建,并且最好只能由类B来创建。

具体做法:将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中。


2、开闭原则

软件应该对扩展开放,对修改关闭。

也就是在设计一个模块的时候,应该使这个模块可以在不被修改的前提下扩展,即不修改源代码的情况下改变这个模块的行为。

采取哪种行为应该通过配置文件来实现。

具体实现为:

在模块中抽取出一个抽象层,模块的设计针对于这个抽象层来设计。因为抽象层只是一些方法和功能的组合和分类,不包含具体代码,所以引起修改的可能性较小,即抽象层时相对稳定的。而功能的具体的实现交由具体实现层来做,一个类封装一个具体实现,当添加新的实现时,只要将这新的实现包装到一个新的类中,以实现接口的方式接入模块,然后在配置文件中更改配置就可使实现模块功能的扩展。


3、里氏代换原则

所有引用父类的地方必须能透明的使用其子类的对象。

具体做法:

因为能使用基类的地方都能使用子类,所以系统中对对象的定义应尽量使用基类,在运行时在具体确定其子类类型,用子类对象的行为来代替父类对象的行为。

此原则是实现开闭原则的重要方法。

注意:

         子类的所有方法都应该在父类中声明。因为变量在定义时一般用的是父类类型,如果子类中定义了特别的方法,则父类对象引用不了,想当与这个方法不存在,也就没有意义了。


4、依赖倒置原则

高层模块和底层模块之间不应该直接联系,而应该通过一个中间的抽象层来实现联系。抽象不应该依赖实现,实现应该依赖抽象。

一般都是我们都是从具体的实现抽象出接口来抽象出一个抽象层,而此原则要求我们应该先设计好抽象层,再用具体类来实现这个抽象。是一种自顶向下的设计方法。

里氏替换原则是依赖于继承结构来实现模块的抽象层,而依赖倒置则是用接口--实现结构来实现抽象层。

无论是在高层模块还是底层模块,对变量的引用都应该使用抽象层的接口或父类,而不应使用具体的实现类,以免发生类与类之间的强耦合关系。

依赖注入:

所谓的依赖就是一个类中要实现的功能必须以另一个类的功能实现为基础,则这个类就依赖领一个类。所谓依赖注入就是当一个类的内部需要引用另一个类的具体实例时,我们不能直接在这个类中new一个这个类的对象,而是应该通过注入的方式,注入一个已经实例了的对象。

注入的方法有:

构造方法注入,即在构造的时候必须传入一个依赖对象的参数。

setter和getter方式。

接口注入,在接口中定义方法时定义需要传入的参数类型。


5、接口隔离原则

一个接口如果太大,就把他分割为几个小接口。


6、合成复用原则

尽量使用对象组合而不是继承来达到复用的目的。

说明:

使用继承会使类的结构层次加深,不利于系统的简洁。同时如果基类发生改变,则可能引起子类的行为变化或需要修改子类,会影响系统的稳定性、维护性。

使用组合的最大好处是,使两者之间的联系变得松散,就是本类和组合进来的类都可以独立的进行变化。即本类可以派生出自己的子类,而组合进来的类也可以自己独立的派生自己的子类,并且这些子类都能组合再一起使用,从而使系统具有较大的灵活性来面对不断变化的需求。也能很好的符合开闭原则。


7迪米特法则

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值