用例建模-UDD(一)

一.UDD概述

1.1 什么是建模? 

       建模是在科学与工程中广泛用于某一精度的细节层次上提供系统抽象,我们又可以通过分析模型获得对所有开发系统的更好理解。所以,建模就是编码之前对软件应用的设计。

1.2 面向对象方法与UML

       面向对象方法基于信息隐藏、类、继承的概念。信息隐藏可以使得系统模块独立,从而具有更好的可修改性和可维护性。继承则使得我们可以以一种系统化方式对类调整。随着软件应用的面向对象分析和设计方法的流行,UML被提出,即描述面向对象模型的标准化图形语言和表示法。

1.3 软件设计与结构概念

1.3.1 信息隐藏

      信息隐藏是一个基本的设计思想,实现信息隐藏的类封装了一些对系统其他部分隐藏的信息,例如数据结构。类的设计需要确定哪些信息应该隐藏在类中,哪些信息应该放在类的接口中,最重要的思想就是接口与实现相分离,这样接口就成为接口与接口提供者之间的一种契约。在设计建模阶段,信息隐藏类可以使用构造型进行分类。根据分析模型确定的类被分为实体、边界类、控制类和应用逻辑类。

  • 实体类:在分析模型中封装的数据类。
  • 边界类:与外部环境通信并建立接口。
  • 控制类:为同一组对象提供总体协调。
  • 应用逻辑类:封装特定应用的逻辑和算法。

1.3.2 继承与多态

      继承可以用于设计多个相似并非完全相同的类,设计类时应当考虑继承,以使得代码共享和代码的适应性可以在详细的设计和编码中得到充分利用,继承也可以维护或复用设计的时候。如果我们引入继承的概念,最大的好处来自于将继承作为一个增量的修改机制。

     多态用来表示不同的类可以拥有相同的操作,这使得拥有相同接口的对象可以在运作时相互替换。多态分编译多态和运行时多态,如果是编译型多态,请求与操作之间的关联在编译时完成并且不能在运行时改变;运行时多态意味着请求与对象操作的绑定是运行时完成的,并且可以又一种转变为另一种。

  • 运行时多态:
class Animal
{
public :
    void Animal();
    virtual void shout() = 0;
};

void Animal::Animal()
{
    std::cout << "Constructor of Animal" << std::endl;
}

class Dog :public Animal
{
public:
    void Dog();
    virtual void shout(){ cout << "汪汪!"<<endl; }
};

void Dog::Dog()
{
    std::cout << "Constructor of Dog" << std::endl;
}

class Cat :public Animal
{
public:
    virtual void shout(){ cout << "喵喵~"<<endl; }
};

class Bird : public Animal
{
public:
    virtual void shout(){ cout << "叽喳!"<<endl; }
};

int main()
{
    Animal * anim1 = new Dog;
    Animal * anim2 = new Cat;
    Animal * anim3 = new Bird;
     
    //指针的类型都是基类,通过指针(或引用)调用的接口,
    //在运行期确定指针(或引用)所指对象的真正类型,调用该类型对应的接口
    anim1->shout();
    anim2->shout();
    anim3->shout();
 
    //delete 对象
    delete anim1;
    delete anim2;
    delete anim3;
    return 0;
}

        如果一个类有一个或者多个成员函数是虚函数,编译器就为这个类创建一个虚函数表。这个表为每一个虚成员函数记录一个指针(内存地址)。指针指向相应成员函数代码的入口地址。如果一个虚函数被继承下来,并且没有改变,那么虚函数表中相应项指向的就是这个函数在父类(或者其他祖先类)的定义。如果一个虚函数有新的定义,那么表中这个虚函数的指针就会指向新的定义。记住,虚函数的属性是会继承的,一旦一个类有一个虚函数表,那么所有它的子孙类也会有一个虚函数表。

  • 静态多态
class Animal
{
public :
    void shout() { cout << "发出动物的叫声" << endl; };
};
class Dog
{
public:
     void shout(){ cout << "汪汪!"<<endl; }
};
class Cat
{
public:
     void shout(){ cout << "喵喵~"<<endl; }
};
class Bird
{
public:
     void shout(){ cout << "叽喳!"<<endl; }
};
template <typename T>
void  animalShout(T & t)
{
    t.shout();
}
int main()
{
    Animal anim;
    Dog dog;
    Cat cat;
    Bird bird;
 
    animalShout(anim);
    animalShout(dog);
    animalShout(cat);
    animalShout(bird);
 
    getchar();
}

       在编译之前,函数模板中t.shout()调用的是哪个接口并不确定。在编译期间,编译器推断出模板参数,因此确定调用的shout是哪个具体类型的接口。不同的推断结果调用不同的函数,这就是编译器多态。这类似于重载函数在编译器进行推导,以确定哪一个函数被调用。

二.软件建模

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值