OOAD之面向对象设计原则
学习这个设计模式 真的觉得很抽象,只有自己多多的领会!
在很多时候,很多的知识都会觉得讲起来是很矛盾的。
本章目标
1 掌握内聚度和耦合度的概念
2 掌握面向对象设计原则
(一)如何衡量软件设计的质量
内聚度:表示一个应用程序的单个单元所负责的任务数量和多样性。内聚与单个类或者单个方法单元相关。(在我自己的理解就是:在一个类中完成自己所有的任务,这些任务都在自己的类中。自己的事情自己做)
耦合度:耦合度表示类之间关系的紧密程度。耦合度决定了变更一个应用程序的容易程度。在紧密耦合的类结构中,更改一个类会导致其它的类也随之需要做出修改。
设计原则:
“高内聚 低耦合”是
在设计时遵循的一定的设计原则:
1
|
设计原则名称 |
设计原则简介 |
重要性 |
|
单一职责原则 |
类的职责要单一,不能将太多的职责放在一个类中。 |
★★★★☆ |
|
开闭原则 |
软件实体对扩展是开放的,但对修改是关闭的,即在不修改一个软件实体的基础上去扩展其功能。 |
★★★★★ |
|
里氏替换原则 |
在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象。 |
★★★★☆ |
|
依赖倒转原则 |
要针对抽象层编程,而不要针对具体类编程。 |
★★★★★ |
|
接口隔离原则 |
使用多个专门的接口来取代一个统一的接口。 |
★★☆☆☆ |
|
组合/聚合复用原则 |
在系统中应该尽量多使用组合和聚合关联关系,尽量少使用甚至不使用继承关系。 |
★★★★☆ |
|
迪米特法则 |
一个软件实体对其他实体的引用越少越好,或者说如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,而是通过引入一个第三者发生间接交互。 |
★★★☆☆ |
一: 单一职责原则:
针对单个领域类的抽象化
开闭原则是核心:开闭原则是面向对象设计的核心所在。遵循这个原则可以带来灵活性、可重用性和可维护性。
其它设计原则(里氏替换原则、依赖倒转原则、组合/聚合复用原则、迪米特法则、接口隔离原则)是实现开闭原则的手段和工具。
OOAD理论的知识很多,实践的比较少的。理解起来呢 真的比较抽象的,有些时候讲的知识也感觉是矛盾的。
package com.lovo.chap2;
/**
* 长方形 父类
* @author acer
*
*/
public class Rectangle {
private int width;
private int height; public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
} }
package com.lovo.chap2;
/**
* 正方形继承长方形
* @author acer
*
*/
public class Square extends Rectangle {
@Override
public void setHeight(int height) {
super.setHeight(height);
super.setWidth(height);
} }
package com.lovo.chap2;
public class test {
public void design(Rectangle rc){
while(rc.getHeight()<=rc.getWidth()){//这里为什么还要用等于呢
System.out.println(rc.getHeight());
rc.setHeight(rc.getHeight()+1);
}
}
public static void main(String[] args) {
test t=new test();
Rectangle re=new Rectangle();
re.setHeight(50);
re.setWidth(100);
t.design(re);
Square s=new Square();
s.setHeight(200);
t.design(s);
}
}
动作正确性保证:符合里氏代换原则的类扩展不会给已有的系统引入新的错误。
package com.lovo.dip;
public interface Study {
public void read();
}
package com.lovo.dip;
/**
* 读书
* @author acer
*
*/
public class ReadBooks implements Study { @Override
public void read() {
System.out.println("读书学习");
} }
package com.lovo.dip;
/**
* 报纸
* @author acer
*
*/
public class ReadPaper implements Study { @Override
public void read() {
System.out.println("读报纸学习");
} }
package com.lovo.dip;
/**
* 网页
* @author acer
*
*/
public class Online implements Study { @Override
public void read() {
System.out.println("网页学习!");
} }
package com.lovo.dip;
public class StudyMethods {
public void read(Study s) {
s.read();
}
}
package com.lovo.dip;
/**
*
* dip 依赖倒转原则
* @author acer
*
*/
public class Test { public static void main(String[] args) {
StudyMethods st=new StudyMethods();
st.read(new ReadPaper());
//st.read(new ReadBooks());
//st.read(new Online()); } }
OOAD之面向对象设计原则的更多相关文章
- 【OOAD】面向对象设计原则概述
软件的可维护性和可复用性 知名软件大师Robert C.Martin认为一个可维护性(Maintainability) 较低的软件设计,通常由于如下4个原因造成: 过于僵硬(Rigidity) ...
- Java程序员应该了解的10个面向对象设计原则
面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...
- UML类图与面向对象设计原则
1. 引言 从大一开始学习编程,到如今也已经有两年了.从最初学习的Html,Js,JaveSe,再到JavaEE,Android,自己也能写一些玩具.学习过程中也无意识的了解了一些所谓的设计模 ...
- C++ 设计模式2 (面向对象设计原则)
1. 变化是复用的天敌! 面向对象设计的最大优势在于 : 抵御变化 2. 重新认识面向对象 理解隔离变化: 从宏观层面来看,面向对象的构建方式更能适应软件的变化, 能将变化所带来的影响减为最小. 各司 ...
- 面向对象设计原则OO
面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...
- (转)Java程序员应该了解的10个面向对象设计原则
面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...
- Java程序员应当知道的10个面向对象设计原则
面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) . Decorator(装饰器).Observer(观察者) 等设计模式,而没有把足够多的注 ...
- 【面向对象设计原则】之里氏替换原则(LSP)
里氏代换原则由2008年图灵奖得主.美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing 教授于1994年提出,所以使用的是这位女博士的性命名的一个 ...
- 【面向对象设计原则】之依赖倒置原则(DIP)
依赖倒转原则(Dependency Inversion Principle, DIP):抽象不应该依赖于细节,细节应当依赖于抽象.换言之,要针对抽象(接口)编程,而不是针对实现细节编程. 开闭原则( ...
随机推荐
- Ajax请求php返回json对象数据中包含有数字索引和字符串索引,在for in循环中取出数据的顺序问题
//php中的数组数据格式 Array ( [all] => Array ( [title] => ALL [room_promotion_id] => all ) [best_av ...
- Python学习-4.Python的模块加载(二)
1.部分函数加载 from SameFolder import printSameFolder printSameFolder() 该代码指从SameFolder.py中加载printSameFold ...
- 射线与平面的相交检测(Ray-Plane intersection test)【转】
射线的定义 在欧几里德几何中,射线的定义是:直线上一点和它一旁的部分.由此可知,射线有两个性质,一是只有一个端点,二是一端无限延伸. 射线的参数方程 其中p0是射线的起点, u是射线的方向向量,t & ...
- 【加密算法】AES
一.简介 AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高. 用AES加密2000年10月,NIST(美国国家标准和技术协会 ...
- MessageBox实现自动延时关闭
1,首先新建一个winform窗体:MessageForm,设置StartPosition属性为Manual,Location属性值-500, -500 主要是为了让MessageForm窗体不显示在 ...
- 如何使用socket进行java网络编程(四)
在上一篇的结尾,提到过用来处理每一个服务端accept到的socket,我们由原来最开始的单线程改成了多线程去处理,但是对每一个接收到的socket都new一个thread去处理,这样效率太低,我们需 ...
- AJPFX的资金安全性
AJPFX承诺保证客户资金安全,并严格按照英国的相关规章制度从事经营活动.客户资金存放于投资级银行的独立账户中.通过实行公司资产与客户资金分别保管,在发生无偿债能力的罕见情况下,客户可获退还独立存放资 ...
- Android 导入 aar 库文件
1. 在需要导入 aar 的 module 目录下创建一个名叫 "aars" 的目录,并把 aar 文件复制到这里. 2. 在项目的 build.gradle 文件里添加 allp ...
- python爬虫从入门到放弃(一)——试用bs4, request爬百度股票
文章实践主要来自于:https://mp.weixin.qq.com/s/FiKqb06nz0K0AD9VUWJapw 爬虫流程: 明确目的(哪些数据),确认网页可爬,查看源网页是否有需要的数据. b ...
- python小数的进位与舍去
一.基础知识准备 奇进偶舍,又称为四舍六入五成双规则.银行进位法(Banker's Rounding),是一种计数保留法,是一种数值修约规则.从统计学的角度,"奇进偶舍"比&q ...