面向对象的几个基本原则讲义
面向对象的基本原则

在使用面向对象思想进行系统设计时,总结出了若干面向对象设计原则,分别是:单一职责原则、开闭原则、里氏替代原则、依赖注入原则、接口分离原则、迪米特原则和组合/聚合复用原则。
这些原则是面向对象设计的基石,坚持这些原则是增强系统扩展性、降低耦合性的重要保证。
下面介绍单一职能原则。
单一职能原则一、定义单一职责原则(SRP),英文全称是Single Responsibility Principle,该原则的思想是:系统中的每一个类都应该只有一个单独的职责,而所有类所关注的就是自身职责的完成。
SRP中,把职责定义为“变化的原因”。
如果你能想到多个原因去改变一个类,那么这个类就具有多于一个的职责。
二、好处其实单一职责原则的意思就是开发人员经常说的“高内聚、低耦合”。
也就是说,每个类应该只有一个职责,对外只能提供一种功能,而引起类变化的原因应该只有一个。
如果一个类有一个以上的职责,这些职责就耦合在了一起,当一个职责发生变化时,可能会影响其它的职责。
另外,多个职责耦合在一起,会影响复用性,我们可能只需要复用该类的某一个职责,但这个职责跟其它职责耦合在了一起,很难分离出来。
单一职责原则简单而直观,但在实际应用中很难实现。
SRP中,把职责定义为“变化的原因”,这里说的“变化的原因”,只有实际发生时才有意义。
可能预测到会有多个原因引起这个类的变化,但rug仅仅是预测,并没有真的发生,这个类仍可看做具有单一职责,不需要分离职责。
如果分离,会带来不必要的复杂性。
单一职责原则的尺度如何掌握,是不是应该百分之百的做到呢?原则还是需求导向,即需求决定设计。
实际操作中,类设计时的职责划分和类粒度的确定不是一件很简单的事情,需要设计者经验的积累和对需求的仔细分析。
三、总结众所周知,面向对象编程语言可以提高程序的封装性、复用性、可维护性,但仅仅是“可以”。
能不能实现OOPL的这些优点,要看具体怎么做。
如果一个类的代码非常混乱,各种功能的代码都混在一起,封装性、复用性、可维护性无从谈起。
面向对象三原则

面向对象三原则
面向对象三原则是指信息隐藏原则、继承原则和多态原则。
这些原则是指导面向对象程序设计的基本原则,有助于提高代码的可维护性、可复用性和可扩展性。
1. 信息隐藏原则(Encapsulation):将对象的内部状态和实现细节封装起来,只对外暴露必要的接口。
通过将数据和相关操作封装在一个类中,可以达到保护数据的目的,同时也能够隔离变化,提高代码的灵活性和可复用性。
2. 继承原则(Inheritance):通过继承机制,可以在不修改已有代码的情况下,扩展和重用已有类的功能。
通过继承,子类可以继承父类的属性和方法,并且可以在其基础上进行扩展和修改。
3. 多态原则(Polymorphism):允许不同对象以自己的方式响应共同的消息或方法调用。
即同一消息可以有多种不同的响应方式,不同的对象可以根据自己的特性来实现这个消息。
多态性可以提高代码的灵活性和可扩展性。
这些原则在面向对象编程中非常重要,可以帮助开发者设计出高质量、可复用和可扩展的代码。
面向对象编程原则

面向对象编程原则面向对象编程是一种常见的软件开发方法,它将程序构建成相互关联的对象集合。
在面向对象编程中,有一些基本原则需要遵循,以确保代码的可维护性、可扩展性和可重用性。
本文将探讨面向对象编程的原则。
1. 单一职责原则(Single Responsibility Principle,SRP)单一职责原则指出一个类应该只负责一个职责或功能。
这意味着一个类应该只有一个引起它的变化的原因。
通过遵循单一职责原则,可以使类的设计更加灵活、可维护,并降低引入Bug的风险。
2. 开放封闭原则(Open-Closed Principle,OCP)开放封闭原则要求软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
这意味着在添加新功能时,不需要修改已有的代码。
通过使用接口、抽象类和多态等技术,可以实现代码的可扩展性。
3. 里氏替换原则(Liskov Substitution Principle,LSP)里氏替换原则要求使用基类的代码可以在不知道子类的情况下正常工作。
换句话说,子类应该能够替换其基类而不引起错误或异常。
遵循里氏替换原则可以减少代码的耦合性,提高代码的可维护性和可扩展性。
4. 依赖倒置原则(Dependency Inversion Principle,DIP)依赖倒置原则指出高级模块不应该依赖低级模块,二者都应该依赖于抽象。
这意味着在设计类之间的关系时,应该依赖于接口或抽象类,而不是具体实现。
通过遵循依赖倒置原则,可以实现代码之间的松耦合关系,提高代码的可测试性和可维护性。
5. 接口隔离原则(Interface Segregation Principle,ISP)接口隔离原则要求接口应该尽量小而精确,不应该包含不需要的操作。
这意味着一个类不应该强制实现它不需要的接口。
通过遵循接口隔离原则,可以提高代码的灵活性和可维护性,并减少不相关代码之间的耦合。
6. 迪米特法则(Law of Demeter,LoD)迪米特法则要求尽量减少对象之间的相互依赖关系。
面向对象5大原则

面向对象五大基本原则以前一直认为程序中的类有使用到封装继承多态就是面向对象设计,其实不然封装,继承,多态只是面向对象的三大特性,但是在设计程序的时候并不是说类的结构使用到了(或是体现出了)这三个特性就是面向对象,其实真正的面向对象设计是要符合下面的五大原则,面向对象的五大基本原则单一职责原则(SRP)开放封闭原则(OCP)里氏替换原则(LSP)依赖倒置原则(DIP)接口隔离原则(ISP)单一职责原则(SRP)•一个类应该仅有一个引起它变化的原因(最简单,最容易理解却最不容易做到的一个设计原则)职员类例子:比如在职员类里,将工程师、销售人员、销售经理这些情况都放在职员类里考虑,其结果将会非常混乱,在这个假设下,职员类里的每个方法都要if else判断是哪种情况,从类结构上来说将会十分臃肿,并且上述三种的职员类型,不论哪一种发生需求变化,都会改变职员类!这个是大家所不愿意看到的!开放封闭原则(OCP)•既开放又封闭,对扩展是开放的,对更改是封闭的!•扩展即扩展现行的模块,当我们软件的实际应用发生改变时,出现新的需求,就需要我们对模块进行扩展,使其能够满足新的需求!更改封闭即是在我们对模块进行扩展时,勿需对源有程序代码和DLL进行修改或重新编译文件!这个原则对我们在设计类的时候很有帮助,坚持这个原则就必须尽量考虑接口封装,抽象机制和多态技术!里氏替换原则(LSP)•子类可以替换父类并且出现在父类能够出现的任何地方•这个原则也是在贯彻GOF倡导的面向接口编程!在这个原则中父类应尽可能使用接口或者抽象类来实现!子类通过实现了父类接口,能够替父类的使用地方!通过这个原则,我们客户端在使用父类接口的时候,通过子类实现!意思就是说我们依赖父类接口,在客户端声明一个父类接口,通过其子类来实现这个时候就要求子类必须能够替换父类所出现的任何地方,这样做的好处就是,在根据新要求扩展父类接口的新子类的时候而不影响当前客户端的使用!依赖倒置原则(DIP)•传统的结构化编程中,最上层的模块通常都要依赖下面的子模块来实现,也称为高层依赖低层!所以DIP原则就是要逆转这种依赖关系,让高层模块不要依赖低层模块,所以称之为依赖倒置原则!ISP 接口隔离原则•这个原则的意思是:使用多个专门的接口比使用单个接口要好的多!实际编程中,为了减少接口的定义,将许多类似的方法都放在一个接口中,最后发现,维护和实现接口的时候花了太多精力,而接口所定义的操作相当于对客户端的一种承诺,这种承诺当然是越少越好,越精练越好,过多的承诺带来的就是你的大量精力和时间去维护!。
深入理解面向对象——六大基本原则

深⼊理解⾯向对象——六⼤基本原则这六⼤原则任何⾯向对象的语⾔都应该遵守的,要想让你的代码易扩展⾼服⽤就尽量去满⾜这六⼤原则吧,不⼀定严格按照某种设计模式,但是如果你的代码符合这六⼤原则,那么你的代码就是好代码了,好的代码不⼀定是严格按照设计模式写的代码。
单⼀职责原则(SRP)Single Responsibility Principle,单⼀职责原则。
定义:不要存在多于⼀个导致类变更的原因。
通俗的说,即⼀个类只负责⼀项职责。
优点:可以降低类的复杂度,⼀个类只负责⼀项职责,逻辑简单;提⾼类的可读性,提⾼系统的可维护性;变更引起的风险降低,变更是必然的。
SRP其实也蕴含着深沉的⼈⽣智慧——任何事情要想做好就必须要专⼼致志地做。
⾥⽒替换原则(LSP)Liskov Substituition Principle,⾥⽒替换原则。
定义:⼦类可以扩展⽗类的功能,但不能改变⽗类原有的功能。
当使⽤继承时,遵循⾥⽒替换原则。
⼦类继承⽗类时,除添加新的⽅法完成新增功能外,尽量不要重写⽗类的⽅法,也尽量不要重载⽗类的⽅法。
依赖倒置原则(DIP)Dependence Inversion Principle,依赖倒置原则。
定义:⾼层模块不应该依赖低层模块,⼆者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
例如,业务逻辑层相对于数据层是⾼层模块,因为业务逻辑层需要调⽤数据层去连接数据库,但是要做到可扩展⾼复⽤,尽量不要让业务逻辑层依赖数据层(如数据库类型mysql,pgsql),可以在数据层抽象出⼀个接⼝(如pdo),让业务逻辑层依赖于这个抽象接⼝(统⼀操作数据库⽅法名)。
⽰例:interface DB{public function connect();public function add();public function update();public function query();public function del();}class Mysql implements DB{}class Sqlite implements DB{}开放封闭原则(OCP)Open-Close Principle,开-闭原则。
面向对象的四项基本原则

面向对象的四项基本原则这四项基本原则就像是面向对象编程这个大王国里的四位大管家,各管一摊,超级重要呢!1. 单一职责原则这个原则就好比是说,每个人都只干自己擅长的一件事儿,不要啥都揽着。
在面向对象里呢,就是一个类啊,它就只负责一个功能。
比如说,有个类是专门管计算长方形面积的,那就别让它再去管长方形周长的计算啦。
不然的话,这个类就变得很臃肿,就像一个人又要当厨师又要当司机又要当医生,肯定会乱套的呀。
2. 开闭原则这可是个很有趣的原则呢。
简单来说就是,对扩展开放,对修改关闭。
啥意思呢?就像是搭积木,你可以增加新的积木块(扩展功能),但是已经搭好的部分(原有的代码)就不要乱动啦。
比如说你写了个游戏,里面有各种角色,后来你想加个新的超级英雄角色,那你就直接写个新的类来表示这个超级英雄就好啦,不要去改原来那些角色类的代码。
这样可以保证之前的功能不会被破坏,而且新功能也能顺利加进去。
3. 里氏替换原则这个原则有点像角色扮演的游戏规则。
如果有个父类,然后有个子类,子类应该能够完全替代父类的位置,并且表现得很正常。
比如说,父类是动物,有个“叫”的方法,子类是狗,狗也是动物嘛。
那狗这个子类的“叫”方法就应该符合动物类的“叫”方法的逻辑。
不能说动物叫是“汪汪汪”,结果狗叫是“喵喵喵”,那就不对啦。
4. 依赖倒置原则这个原则像是一种关系的反转。
就是说高层模块不应该依赖低层模块,它们都应该依赖抽象。
比如说,有个高层模块是做蛋糕的,低层模块是提供面粉、鸡蛋这些材料的。
那做蛋糕这个模块不应该直接依赖于具体的面粉、鸡蛋的来源,而是依赖于一个抽象的“食材提供者”。
这样的话,如果换了食材的来源(比如从本地农场换成了进口供应商),做蛋糕的模块也不用改,只要这个新的供应商也符合“食材提供者”这个抽象的定义就好啦。
这四项基本原则在面向对象编程里就像指南针一样,指引着我们写出更好、更合理、更容易维护的代码呢。
面向对象编程的基本原则和技术应用

面向对象编程的基本原则和技术应用一、概述面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它采用“对象”作为程序的基本单元,将数据和操作绑定在一起。
其基本思想是通过封装、继承和多态等特性来实现程序设计的灵活性、可组合性和可维护性。
二、基本原则1.封装封装是将对象的内部信息隐藏,只暴露有限的接口供其他对象访问,从而提高数据的安全性和可维护性。
封装可以通过使用private、protected和public关键字来实现。
2.继承继承是一种利用已有类作为基础,创建新类的机制。
新类可以继承基础类的属性和方法,并可以进行扩展和重写。
继承可以通过使用extends关键字来实现。
3.多态多态是指相同的方法在不同的对象上产生不同的行为。
实现多态的关键是方法的重写和方法的参数或返回类型的多态性。
三、技术应用1.类和对象的定义类是对具有相同属性和行为的对象的抽象。
对象是类的实例,具有类定义的属性和方法。
在Java中,定义类需要使用class关键字,定义对象需要使用new运算符。
2.构造函数和析构函数构造函数(Constructor)是在创建对象时调用的特殊方法,主要用于初始化对象的属性值。
析构函数(Destructor)是在释放对象时调用的方法,主要用于清理对象的资源。
在Java中,构造函数的名字必须与类名相同,而析构函数则不需要。
3.继承和接口继承是一种从现有类派生新的类的机制,从而实现代码的重用和扩展。
接口是一种定义了一组方法签名的规范,实现类必须实现这些方法。
Java中支持单继承和多实现的方式来定义类和接口。
4.重载和重写重载是指在同一个类中定义多个方法,方法名相同但参数列表不同,在调用时可以根据参数的不同自动匹配合适的方法。
重写是在子类中重写父类的方法,以实现不同的行为。
Java中支持方法的重载和重写机制。
四、总结面向对象编程采用灵活、可维护和可扩展的程序设计思想,通过封装、继承和多态等特性实现程序的高效和可靠。
面向对象七大原则

面向对象七大原则
1.单一职责原则(SRP):
一个类或者模块只应该有一个单一的功能或职责。
2.开闭原则(OCP):
软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
3.里氏替换原则(LSP):
使用基类类型的对象应该能够在不知道子类的情况下正常工作。
4.依赖倒置原则(DIP):
高层模块不应该依赖底层模块,二者都应该依赖其抽象。
5.接口隔离原则(ISP):
不应该强迫客户端依赖它们不需要的接口。
6.最小知识原则(迪米特法则)(LoD):
一个对象应该对其他对象有最少的了解。
7.合成复用原则(CRP):
尽量使用对象组合而不是继承来达到代码复用的目的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//Geometry.java public abstract class Geometry{
public abstract double getArea(); }
//Pillar.java
public class Pillar{ Geometry bottom; double height;
bottom = new Circle(10); pillar = new Pillar(bottom,58); System.out.println(pillar.getVolume()); } }
5.2 开-闭原则
•所谓 “开-闭原则”(Open-Closed Principle)就是让你的设计应当对扩 展开放,对修改关闭。 •如果您的设计遵守了“开-闭原则”, 那么这个设计一定是易维护的,因为在 设计中增加新的模块时,不必去修改设 计中的核心模块。
2.组合与复用
• “黑盒”复用。 • 优点
– 使用委托机制 – 弱耦合关系 – 运行illar.java
public class Pillar{ Circle bottom; double height;
Pillar(Circle bottom, double height){ this.bottom = bottom; this.height = height;
} public double getVolume (){
Pillar(Geometry bottom, double height){ this.bottom = bottom; this.height = height;
} public double getVolume(){
return bottom.getArea()*height; } }
//Circle.java
(2)接口 接口(interface)具有如下特点: •接口中只可以有public权限的abstract方 法,不能有非abstract方法。 •接口由类去实现,即一个类如果实现一 个接口,那么它必须重写接口中的 abstract方法,即将abstract方法重新声 明,但必须去掉abstract修饰符,同时 要保证声明的方法名字、返回类型、参 数个数和接口中的方法完全相同。
本资料来源
第五章 面向对象的几个基本原则
5.1 面向抽象原则
1.抽象类和接口 (1)抽象(abstract)类 抽象(abstract)类具有如下特点: •抽象类中可以有abstract方法,也可以有非abstract 方法。 •抽象类不能用new运算符创建对象。 •如果一个非抽象类是某个抽象类的子类,那么它必 须重写父类的abstract方法,即在子类中将abstract 方法重新声明,但必须去掉abstract修饰符,同时要 保证声明的方法名字、返回类型、参数个数和类型 与父类的abstract方法完全相同。
public class Circle extends Geometry{ double r; Circle(double r){ this.r = r; } public double getArea(){ return(3.14*r*r); }
}
//Rectangle.java
public class Rectangle extends Geometry{ double a,b; Rectangle(double a,double b){ this.a = a; this.b = b; } public double getArea(){ return a*b; }
如果您的设计遵守了“开-闭原则”,那么这个设计一 定是易维护的,因为在设计中增加新的模块时,不必去 修改设计中的核心模块。
该设计中的Geometry和Pillar类就是系统 中对修改关闭的部分,而Geometry的子类是对 扩展开放的部分。当我们向系统再增加任何 Geometry的子类时(对扩展开放),不必修改 Pillar类,就可以使用Pillar创建出具有 Geometry的新子类指定的底的柱体。
}
//Application.java public class Application{
public static void main(String args[]){ Pillar pillar; Geometry bottom; bottom = new Rectangle(12,22); pillar = new Pillar(bottom,58); System.out.println(pillar.getVolume());
之所以提倡多用组合,少用继承, 是因为在许多设计中,人们希望系统 的类之间尽量是低耦合的关系,而不 希望是强偶合关系。即在许多情况下 需要避开继承的缺点,而需要组合的 优点。
1.继承与复用
• “白盒”复用 • 优点
– 易于修改、扩展被复用的方法
• 缺点
– 无法在运行时改变从父类继承的方法的行为 – 子类和父类是强耦合关系 – 父类的内部细节对于子类而言是可见的
2.面向抽象
所谓面向抽象编程,是指当设计一个 类时,不让该类面向具体的类,而是面向 抽象类或接口,即所设计类中的重要数据 是抽象类或接口声明的变量,而不是具体 类声明的变量。
//Circle.java
public class Circle{ double r; Circle(double r){ this.r = r; } public double getArea(){ return(3.14*r*r); }
通常我们无法让设计的每个部分都遵守“开 -闭原则”,甚至不应当这样去做,我们应当把 主要精力集中在应对设计中最有可能因需求变 化而需要改变的地方,然后想办法应用“开-闭 原则”。
当设计某些系统时,我们经常需要面向抽象
来考虑系统的总体设计,不要考虑具体类,这 样就容易设计出满足“开-闭原则”的系统。
5.3 多用组合少用继承原则