名词解释:
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学习天地
一起进步,更多资源等你来学习。