什么是OOAD?什么是UML?

OOAD

什么是OOAD?

面向对象的分析与设计,使用面向对象的思想对一个系统的分析与设计

UML:

什么是UML?

统一的建模语言,什么是建模?将客观事物图形化,比如盖楼房,首先要把地基打好

统一指的是什么?在计算机领域有很多的图形语言,这样就需要一个标准,UML就是这样的一个标准,建模就是将需求用图的方式表达出来

 

UML的组成:

1.      元素:角色,用例

2.      图形

3.      扩展机制:扩展基本元素功能的机制

 

图形分类:

静态图,动态图

静态图:类图(描述类与类之间关系的图),对象图,部署图(拓扑结构),组件图,用例图(从客户的角度来描述系统的整个功能)

动态图:协作图(按空间的交互图),序列图(时序图,描述多个对象按时间的交互过程),活动图(描述业务流程,也能做一个操作的建模),状态图(描述单个的对象,或者是单个的子系统的状态变化)

 

类图:

类图,描述类与类之间关系的图

例子:图书管理系统

1.      利用OO的思想找对象::图书管理员,借书人,库存管理人员,书籍等等

2.      把他们抽象出来:找到与业务有关系的对象和对象的属性

3.      形成类,画出类图来

4.      实例并建立实例间的通讯

 

类之间的关系:

1.      继承

2.      实现

3.      关联

4.      依赖

5.      聚合

6.      组合

什么是关联?类的属性使用的是另一个类的引用或者是对象

什么是依赖?除了属性,其他地方使用了另一个类的对象,引用,属性,方法就叫A类依赖B

/**

 * 知识点:

 * 关联

 * 程序目标:

 * java文件说明:

 * A.java

 * B.java

 * Test.java:

 * AB关联起来,A类调用B类的方法,B类使用A类的方法

 */

package MY.module01.leitu.guanlian;

 

public class Test {

       public static void test(){

              A a=new A();

              B b=new B();

              a.setB(b);

              b.setA(a);

              a.getB().bf();

              b.getA().af();

       }

       /**

        * @param args

        */

       public static void main(String[] args) {

              // TODO Auto-generated method stub

              Test.test();

       }

 

}

package MY.module01.leitu.guanlian;

 

public class A {

       private B b;

 

       public A() {

              super();

              // TODO Auto-generated constructor stub

       }

 

       public A(B b) {

              super();

              // TODO Auto-generated constructor stub

              this.b = b;

       }

 

       public B getB() {

              return b;

       }

 

       public void setB(B b) {

              this.b = b;

       }

      

       public void af(){

              System.out.println("A‘s af()");

       }

}

package MY.module01.leitu.guanlian;

 

public class B {

       private A a;

 

       public B() {

              super();

              // TODO Auto-generated constructor stub

       }

 

       public B(A a) {

              super();

              // TODO Auto-generated constructor stub

              this.a = a;

       }

 

       public A getA() {

              return a;

       }

 

       public void setA(A a) {

              this.a = a;

       }

       public void bf(){

              System.out.println("B‘s bf()");

       }

}

/**

 * 知识点:

 * 依赖的三种情况

 * 程序目标:

 * java文件:

 * A.java

 * B.java

 * 一个类的方法去使用另一个类的元素

 */

package MY.module01.leitu.yilai;

 

public class A {

      

       public void a1(B b){

              int rst=b.add(1,2);

              System.out.println(rst);

       }

      

       public void a2(){

              B b=new B();

              int rst=b.add(1,2);

              System.out.println(rst);

       }

      

       public void a3(){

              int rst=B.add2(10,20);

              System.out.println(rst);

       }

       public static void main(String[] args) {

              // TODO Auto-generated method stub

              A a=new A();

              a.a1(new B());

              a.a2();

              a.a3();

       }

 

}

package MY.module01.leitu.yilai;

 

public class B {

       public int add(int i,int j){

              return i+j;

       }

      

       public static int add2(int i,int j){

              return i+j;

       }

}

什么是聚合?

比如说同学聚会,有很多的同学聚集在一起,但是,缺少几个也没有什么关系

什么是组合?

比如说人,有心脏,,,组成为一个人,如果少了其中的一部分,就会死掉,谁也离不开谁

静态图:用例图

从客户的角度来描述系统的整个过程

组成:

角色,用例,关联

角色之间的关系:

继承关系,依赖关系

例如:客户是一个角色,客户分为大客户,小客户,这是继承关系

借书人和图书管理员就是依赖关系

用例的关系:包含,扩展关系

例如:借书功能:登陆,查询等,这个是包含

 

静态图:部署图

整个系统的软硬件拓扑结构

:CPU,eclipes

 

静态图:组件图

表示物理的实现,实现指的是代码,这个用的少

 

动态图:序列图

按时间的先后顺序描述对象之间的交互

/**

 * 知识点:

 * 模拟序列图的执行

 * 程序目标:

 * java文件:

 * Client.java:调用MainController类的方法

 * MainController.java:这个方法中调用了Service类的方法

 * Service.java:这个类的方法调用了另一个类的方法

 * DAO.java:这个类的方法调用自身的一个方法,这叫反身消息

 */

package MY.module01.leitu.xulietu;

 

public class Client {

 

       /**

        * @param args

        */

       public static void main(String[] args) {

              // TODO Auto-generated method stub

              MainController m=new MainController();

              m.f();

       }

 

}

package MY.module01.leitu.xulietu;

 

public class MainController {

       public void f(){

              Service s=new Service();

              s.f();

       }

}

package MY.module01.leitu.xulietu;

 

public class Service {

       public void f(){

              DAO d=new DAO();

              d.genName();

       }

}

package MY.module01.leitu.xulietu;

 

public class DAO {

       public void genName(){

              System.out.println("hello");

              f();

       }

       private void f(){

              System.out.println("dao‘s shi fan shen");

       }

}

 

动态图:活动图

可以有分之的判断

 

动态图:状态图

可以看到对象的状态变化

 

设计模式:

为什么要设计?

1.      软件的复用

2.      软件的维护

 

开闭原则:

对高层的修改关闭,对低层的扩展开放

模板方法:它实现了开闭原则

/**

 * 知识点:

 * -闭原则:模板方法

 * 程序目标:

 * java文件:

 * CET6.java:高层的逻辑,只开发了给低层用的方法,,

 * ConcretCET6.java:这里来实现听,

 * TestCET6.java

 */

package MY.module01.sjms.kbyz;

 

public class TestCET6 {

 

       /**

        * @param args

        */

       public static void main(String[] args) {

              // TODO Auto-generated method stub

              CET6 c=new ConcretCET6();

              c.passCET6();

       }

 

}

package MY.module01.sjms.kbyz;

 

public abstract class CET6 {

       //高层业务逻辑

       public final void passCET6(){

              listen();

              say();

       }

       //提供给低层实现的业务

       abstract protected void listen();

       abstract protected void say();

}

package MY.module01.sjms.kbyz;

 

public class ConcretCET6 extends CET6{

 

       @Override

       protected void listen() {

              // TODO Auto-generated method stub

              System.out.println("listen");

       }

 

       @Override

       protected void say() {

              // TODO Auto-generated method stub

              System.out.println("say");

       }

      

}

 

里氏代换原则:

任何父类适用的地方,子类一定适用,子类可以当父类用

策略模式:实现了里氏代换原则,解决了可选算法的问题

什么是策略模式?针对共同的问题,提供解决方案或指导原则或好坏结果

/**

 * 知识点:

 * 里氏代换原则:策略模式

 * 程序目标:

 * 打折的例子,涉及到可选算法的问题

 * java文件:

 * Context.java:打折的方法和设置折扣的方法,DisCount为关联关系

 * 这里体现了里氏代换原则,子类当父类用

 * DisCount.java:打折算法抽象类

 * dis1.java:打折算法1

 * dis2.java:打折算法2

 * Client.java:1.设置折扣率,2.打折

 */

package MY.module01.sjms.celuemoshi;

 

public class Client {

 

       /**

        * @param args

        */

       public static void main(String[] args) {

              // TODO Auto-generated method stub

              Context c=new Context();//算法选择器

//          c.setD(new dis2());

              c.setD(new dis1());//选择折扣

              c.getprice(100);//打折

       }

 

}

package MY.module01.sjms.celuemoshi;

 

public class Context {

       private DisCount d;

 

       public void setD(DisCount d) {

              this.d = d;

       }

      

       public void getprice(double price){

               System.out.println(d.discout(price));

       }

}

package MY.module01.sjms.celuemoshi;

 

public class dis1 extends DisCount{

 

       @Override

       public double discout(double price) {

              // TODO Auto-generated method stub

              return price*0.8;

       }

 

}

package MY.module01.sjms.celuemoshi;

 

public class dis2 extends DisCount{

 

       @Override

       public double discout(double price) {

              // TODO Auto-generated method stub

              return price;

       }

 

}

package MY.module01.sjms.celuemoshi;

 

public abstract class DisCount {

       public abstract double discout(double price);

}

 

依赖倒转原则:

什么是依赖倒转原则?要依赖抽象,不要依赖具体实现

这句话是什么意思呢?抽象指的是什么?具体实现指的又是什么?谁要依赖抽象?

一个程序要按照高层的设计思路来实现具体的程序功能,抽象就是高层,具体实现就是为了完成高层的一个目标而写的程序代码,高层就是战略,低层是战术,高层是整体目标,低层是目标的实现,高层是思想,低层是行为

什么是倒转?这个名字的含义是什么?

以往的过程式编程注重的是具体的功能实现方法,也就是低层,它决定了高层,这样是不合理的,所以要将这个错误的方式扭转过来,取名叫依赖倒转原则

三种依赖(耦合)关系的种类:

零耦合:不可能

具体耦合:具体的类和类之间的联系

抽象耦合:高层抽象类与类之间的联系

如何实现依赖倒转原则呢?

三种模式:

第一,工厂方法模式

第二,模板方法模式

第三,迭代子模式

 

接口隔离原则:

使用多个专门的接口要比使用一个总的接口要好

比如:人类(接口学生(具体类老师(具体类)   学生老师类(具体类):这个类要想拥有学生和老师的方法就很麻烦了,所以,需要再添加两个接口,学生接口和老师接口

 

组合聚合复用原则:CARP

将其他对象的功能融合到新的对象里,如果其中一个对象死掉了,另一个对象也不能用了,那么这种情况叫组合,反之,叫聚合

/**

 * 知识点:

 * 依赖关系,组合聚合复用,里氏代换原则结合这是聚合

 * 程序目标:

 * 例子:人学习技能

 * People.java: 具体类

 * Actor.java:技能类接口

 * Student.java:技能类具体类 学习方法

 * Teacher.java:技能类具体类 教书方法

 * Test.java:让人具备学习和教书的方法,并使用这些能力

 */

package MY.module01.sjms.CARP.t1;

 

public class Test {

 

       /**

        * @param args

        */

       public static void main(String[] args) {

              // TODO Auto-generated method stub

              Actor a=new Student();

              Actor b=new Teacher();

              People p=new People();

              p.studyJineng(a);

              p.studyJineng(b);

              p.useJineng();

       }

 

}

package MY.module01.sjms.CARP.t1;

 

public interface Actor {

        void jineng();

}

package MY.module01.sjms.CARP.t1;

 

public class Teacher implements Actor{

 

       public void jineng() {

              // TODO Auto-generated method stub

              System.out.println("theach....");

       }

 

}

package MY.module01.sjms.CARP.t1;

 

public class Student implements Actor{

 

       public void jineng() {

              // TODO Auto-generated method stub

              System.out.println("study..");

       }

 

}

package MY.module01.sjms.CARP.t1;

 

import java.util.ArrayList;

import java.util.List;

 

public class People {

       private String name;

       private int age;

       private List<Actor>list;

      

       public People(){

              list=new ArrayList<Actor>();

       }

      

       public void studyJineng(Actor a){

              list.add(a);

       }

      

       public void useJineng(){

              for(Actor a:list){

                     a.jineng();

              }

       }

}

 

迪米特法则(LoD):

最少知识原则:

1.      尽量减少耦合:类与类之间的访问减少,利用的资源少些

2.      对远程对象的访问最好用粗粒度接口来实现

3.      不要和陌生人说话,只和直接认识的人联系就好了

什么是远程对象?什么是粗粒度接口?

这个远程对象系统外的对象 ,如果有一个朋友圈和一些陌生人,陌生人就属于系统外的对象,就是远程对象,其中有一个人是这个朋友圈的同时也认识这些陌生人,那么如果朋友圈中的其他人想与陌生人联系,需要通过他来实现,这个他就是门面对象 ,这个对象需要通过一个接口来实现,而且这个接口设计的要和这个对象合适

/*

 * 知识点:

 * 迪米特法则(最少知识原则):门面模式

 * 程序目标:

 * Computer.java:看成远程对象

 * Lamp.java:看成远程对象

 * Office.java:看成远程对象

 * People.java:,看成朋友圈

 * WorkOffFacade.java:门面对象

 */

package MY.module01.sjms.Lod.t1;

 

public class People {

 

       /**

        * @param args

        */

       public static void main(String[] args) {

              // TODO Auto-generated method stub

              WorkOffFacade w=new WorkOffFacade();

              w.closeWorkOff();

       }

 

}

package MY.module01.sjms.Lod.t1;

//门面对象

public class WorkOffFacade {

       public void closeWorkOff(){

              new Computer().closeComputer();

              new Lamp().closeLamp();

              new Office().closeOther();

       }

}

package MY.module01.sjms.Lod.t1;

 

public class Computer {

       public void closeComputer(){

              System.out.println("closeComputer");

       }

}

package MY.module01.sjms.Lod.t1;

 

public class Lamp {

       public void closeLamp(){

              System.out.println("closeLamp");

       }

}

package MY.module01.sjms.Lod.t1;

//相当于远程对象

public class Office {

       public void closeOther(){

              System.out.println("closeOther");

       }

}

 

什么是OOAD?什么是UML?

时间: 2024-12-23 07:03:03

什么是OOAD?什么是UML?的相关文章

OOAD利器之UML基础

UML:Unified Modeling Language,即统一建模语言,简单地说就是一种有特殊用处的语言.本文是我初步学习UML的学习笔记,对于我们菜鸟码农来说,让我们做设计的可能性不大,但至少能看懂是必要的. 一.所谓模型 1.1 模型是对现实的简化 模型是提供系统的蓝图,模型可是包括详细计划.也可是是从更高程度考虑系统的总体计划,每个系统可以从不同的方面用不通过的模型来描述.因而每个模型都是在语义上闭合的抽象系统.模型可以是结构性的,强调系统的组织.也可是是行为性的,强调系统的动态方面.

大志非才不就,大才非学不成

零.苦逼码农的自我修养系列 PS:为什么此部分序号是零而不是一?因为这是作为一个码农所应该具有的基础之中的基础,要想做个好码农,此部分还得花大力气啃书啊,这决定了我们看待计算机程序的高度. 0.1 数据结构与算法学习总结系列 (1)你必须知道的指针基础系列: { 预备篇 gcc开发环境搭建 } { 指针的声明和使用.数组与指针的关系 } { 指针的移动.指针的危险 } { sizeof计算长度.strcpy的安全性问题 } { 应用篇 自己实现strlen函数,endsWith函数 } { 内存

需求用例分析之九:序列图

作者:张克强    作者微博:张克强-敏捷307 序列图,也称时序图.顺序图,英文名Sequence Diagram.在雅各布森用例分析方法中鼓励使用各类图形来表达,但恰恰没有明确提到序列图.而科伯恩用例分析方法以结构化/半结构化文本用例为中心,强调基于目标的文本格式,对UML各类图所提甚少. 在RUP和OOAD中,UML序列图的最基本定位是用于识别类与类之间的信息传递,是识别类的方法的最佳场合.它是在得到用例之后初步识别了类之后发挥巨大作用的.序列图是交互图(interaction diagr

笔记一:OOAD与UML

一.面向对象的概念与方法 1.  面向对象 1.1. 面向对象是一种系统建模技术 1.2. 面向对象编程是按照OO的方法学来开发程序的过程 1.3. 通过分析系统内对象的交互来描述或建模一个系统 1.4. 交互的对象最终以类的形式组织 1.5. OO的方法由三部分组成:过程.标识.规则 2.  对象 2.1. 是一个客观存在的.唯一的实体 2.2. 是面向对象编程过程中分析与解决问题的出发点与基础 2.3. 拥有自己的标识.数据与行为 2.4. 可以简单或复杂 2.5. 可以抽象或具体 2.6.

OOAD与UML笔记 -转

http://www.uml.org.cn/oobject/201105105.asp 原文地址 OOAD与UML笔记    2011-05-10 来源:网络   UML基础介绍 1.UML的定义 统一建模语言(UML)是一种图形化的语言,它可以帮助我们在OOAD过程中标识元素.构建模块.分析过程并可通过文档说明系统中的重要细节 2.OOAD OOAD是根据OO的方法学,对软件系统进行分析和设计的过程 -- OOA 分析阶段 -- OOD 设计阶段 3.面向对象 面向对象( Object-Ori

《OOAD与UML那点儿事》目录索引

关键字:OOAD.UML.设计模式 各位园友,大家好,我是Bobby,在学习OOAD和开发的项目的过程中有一些感悟和想法,整理和编写了一些学习资料 [内容简介]掌握某种开发语言,让你实现了由零到一的脱变,如果你能掌握OOAD并能活用OOAD,则能让你实现由一到十的飞跃!知道OOAD的人很多,能在实际工作中用好OOAD的人却不多,本书为你分享作者十多年来实践OOAD的心得体会,学会活用OOAD来提升需求分析及软件设计的能力,学会活用OOAD由需求到设计全程建模.正如同,技术是条永无止境的路,每个人

【UML】UML世界的构成

UML概述 全名:Unified Modeling Language 中文名:统一建模语言 发展历程:"始于1997年一个OMG标准.它是一个支持模型化和软件系统开发的图形化语言,为软件开发的全部阶段提供模型化和可视化支持,包含由需求分析到规格,到构造和配置. 面向对象的分析与设计(OOA&D,OOAD)方法的发展在80年代末至90年代中出现了一个高潮,UML是这个高潮的产物.它不仅统一了Booch.Rumbaugh和Jacobson的表示方法.并且对其作了进一步的发展.并终于统一为大众

对软件开发中uml建模的理解和图形整理(一)

由于uml(统一建模语言)在开发中经常会用到,特别是在软件开发中的OOAD阶段,因此要理解和使用uml显得尤为重要.在uml开始之前,咱先回顾一个OOAD.OOP的主要特征. OOAD:根据面向对象的方法学来对软件系统进行分析和设计的过程.它包括OOA 分析阶段和OOD设计阶段.其中分析阶段主要解决"What to do?"的问题,而设计阶段主要解决"How to do?"的问题.具体来说就是:在OOA分析阶段咱要做的主要工作就是建立对业务问题域的视图(建立模型).

学习笔记---UML(二)

1 OOAD详解 1.1 uml工具 staruml,小巧,用的比较多,还有一款类似的软件,叫jude,用的也比较多. 1.2 面向对象 面向对象是一种系统建模技术,Object-Orientation,简称OO. 面向对象编程是一种使用OO的方法学来开发程序的过程,Object-Orientation Programming,简称OOP. 通过分析系统内对象的交互来描述或建模一个系统. 交互的对象最终以类的形式组织. OO的方法由三部分组成:过程,标识,规则. 1.3 对象 是一个客观存在的.