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):抽象不应该依赖于细节,细节应当依赖于抽象.换言之,要针对抽象(接口)编程,而不是针对实现细节编程. 开闭原则( ...
随机推荐
- 【Win10】一些零碎不好归档的小总结(原谅我这个该死的标题吧)
一.同步方式获取设备的屏幕分辨率 public static class ScreenResolution { /// <summary> /// 获取屏幕高度. /// </sum ...
- C# 创建、部署和调用WebService简单示例
webservice 可以用于分布式应用程序之间的交互,和不同程序之间的交互. 概念性的东西就不说太多,下面开始创建一个简单的webservice的例子.这里我用的是Visual Studio 201 ...
- BitAdminCore框架应用篇:(四)核心套件querySuite按钮功能
索引 NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/coo ...
- .net生成条形码
1..net 标准库(.net standard 2.0) Nuget添加引用:ZXing.Net生成条形码,ZXing.Net.Bindings.ImageSharp生成图片 public stat ...
- super函数的用法
1.创建一个类. # .创建一个类 class Bird: def __init__(self): self.hungry =True def eat(self): if self.hungry: p ...
- map函数和reduce函数、filter函数的区别
①从参数方面来讲:map()函数: map()包含两个参数,第一个是参数是一个函数,第二个是序列(列表或元组).其中,函数(即map的第一个参数位置的函数)可以接收一个或多个参数.reduce()函数 ...
- DateTimeField如何自动设置为当前时间并且能被修改 ——django日期时间字段的使用
参考于:https://www.cnblogs.com/huchong/p/7895263.html 创建django的model时,有DateTimeField.DateField和TimeFiel ...
- Flask基础-配置,路由
一,配置文件 flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置为: { 'DEBUG': get_debug_flag(default=False), 是否 ...
- “全栈2019”Java多线程第二十一章:同步代码块产生死锁的例子
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- 一分钟搞懂 JavaScript this 指向问题
关于Javascript的this指向问题,网络上有很多分析文章,写的很好,比如这里和这里 我这里做一个简单的总结. 箭头函数的 this 箭头函数内的this指向外层函数定义时所在的作用域.如果没有 ...