• OOP面向对象编程的六大原则(上)


    名词解释:

    OOA:面向对象分析 A:Analyze

    OOD:面向对象设计D:Design

    OOP:面向对象编程P:Program


    OOP六大原则(上):对象单一职责、里式替换原则、迪米特法则、开闭原则

    对象单一职责:我们设计的对象必须职责明确,不能让他成为万能类,这里的对象可以是模块、类库,程序集,不单单指类。

    1.特点:最常见的。比如分层:Model、业务层、UI层。把具有相同行为的类、放到一个模块,这个就是模块职责明确。

    2.好处:每个类所包含的行为,属性都属于本身,后续的维护更具有针对性。也就是说这个类的修改,是独立的,不影响其他的类。(分工明确、)后续维护方便。

    里式替换原则:子类必须能够替换掉它的父类类型,反之不行。

    1.好处:因为父类,可以有多个子类对象,那这样的话,后续扩展会非常多。程序不需要修改就能够扩展。

    2.提醒:其实也是从另外一个角度告诉我们,我们开发当中,需要尽量面向“抽象”编程。

    公式:父类类型 变量 =new 子类类型();

    实例如下:

    新建控制台应用程序,新建父类打印类Printer


     

     

    新建子类:惠普打印机类,HPPrinter,继承Printer,并对父类的抽象方法和虚方法进行重写。


     

    Main方法中进行测试:


     

     

    可见:

    父类的普通方法,结果依然调用父类的普通方法;

    父类的抽象方法,重写之后,调用的是子类重写的方法;

    父类的虚方法,重写之后,调用的是子类重写的方法。

    我们知道,虚方法,可以重写,可以不重写,那么不重写,是否调用的就是父类的虚方法呢?注意(抽象方法无具体实现,虚方法有具体实现,抽象方法必须得重写,不然报错,而虚方法可以重写,也可以不重写)


     

    我们把子类重写的父类的虚方法注释掉:输出如下:


     

    调用的果然是未被重写的虚方法:父类的测试方法!

    迪米特法则和开闭原则:

    迪米特法则也叫最小化原则,或者说最小耦合。通常在设计程序和开发程序的时候,我们经常会讲,尽量高类聚,低耦合。而当两个对象之间交互的时候,会导致依赖的产生,我们把这种依赖叫做耦合。为了解决这个问题,OOP建议,这种耦合越少越好。

    典型:就是一个对象作为另外一个对象的成员使用。

    开闭原则:要去开放扩展,而封闭修改。也就是说,当需求变化的时候,我们可以增加对象,来扩展行为,而尽量少修改原有的对象。

    下面代码实例:

    前面我们创建的基类Printer打印类,和它的子类实现惠普打印机类,而根据迪米特法则,我们最好是设计一个中间类,来降低两个类之间的耦合。

    IPrinter printer = new HPPrinter()

    上述这种方式,如果需求发生变化,我们也必须去修改代码,重新编译。而根据开闭原则,我们应该少修改甚至不修改,关闭修改,而开放扩展。在这里,就是有了新的需求之后,增加新的对象,扩展行为。

    所以:而当有新的需求变化,例如今年我们需要惠普打印机,而明年我们需要佳能打印机,这两个实现类的父类打印机类是不变的,我们需要将修改给封闭,开放扩展内容。我们需要一个中间表类,来充当中介角色,在中间类当中,返回所需要的子类,即实现类对象,在那里面实现动态返回所需要的实现类。明年需要佳能打印机,只需要新建一个佳能打印机的实现,并将其写在配置文件当中,这时中介类则会根据配置文件动态读取,并实现返回我们需要的子类。

    接下来,我们做出如下操作:

    新建一个扩展类库,并新建一个中间类,简单工厂类:SimpleFactory.用来根据一个特定的需求,产生一个具体对象的类。

    新建属性,PrinterType,这个属性私有,静态,并从配置文件当中动态读取。(注意core的程序需要自己新建配置文件),并且从Nuget中下载引用Configuration包。


     

    实现成员GetPrinter方法,通过反射动态从程序集动态创建实例,并返回Pinter接口类的实现类:HPPrinter。

    新建服务接口类库,Iservice,用于定义接口。新建IPrinter接口。

    新建服务实现类库,Service,用于实现接口。新建惠普打印机实现类,HPPrinter,继承IPrinter。

    此时:我们可以在Main方法中调用中间类SimpleFactory的方法。


     

    测试如下:


     

    注意:core项目中新建的config文件不要使用默认名,需要命名为App.config

    好了,今天的学习到这里就结束了,欢迎关注微信公众号:dotNET学习天地

    一起学习和交流。

  • 相关阅读:
    JS BOM对象 History对象 Location对象
    JS 字符串对象 数组对象 函数对象 函数作用域
    JS 引入方式 基本数据类型 运算符 控制语句 循环 异常
    Pycharm Html CSS JS 快捷方式创建元素
    CSS 内外边距 float positio属性
    CSS 颜色 字体 背景 文本 边框 列表 display属性
    【Android】RxJava的使用(三)转换——map、flatMap
    【Android】RxJava的使用(二)Action
    【Android】RxJava的使用(一)基本用法
    【Android】Retrofit 2.0 的使用
  • 原文地址:https://www.cnblogs.com/xingxingzhou/p/11704833.html
Copyright © 2020-2023  润新知