设计模式|UML图以及设计模式的分类和设计原则

前言

设计模式是一套用于提高代码可复用性、可维护性、可读性、稳健性以及安全性的方法,是前人总结出来的经验。设计模式并不是唯一的准则,需要根据需求以及实际情况机型调整,必要时可以打破模式。
参考up:爱编程的大丙

名词概念

基础知识:面向对象的封装、继承和多态

UML类图

设计程序之前需要绘制类的结构以及类与类之间的关系
以类为单位绘制类的属性、方法及关系,绘制后可以概述类的定义属性以及行为

类本身

注意点

  • 可见性:+表示public、#表示protected、-表示private、____表示static
  • 属性的表示方法【可见性】【属性名称】:【类型】={初始化值}
  • 方法的表示方式【可见性】【方法名称】(【参数名:参数类型,】):【返回值类型】
  • 抽象类(类中有纯虚函数),类名斜体表示
  • 虚函数斜体表示,纯虚函数在返回值类型后补充=0

    请添加图片描述
    请添加图片描述

类与类的之间关系

  • 继承:使用空心三角箭头表示,箭头指向父类

继承关系图

  • 关联:分为单向关联、双向关联以及自关联,关联是指在某个类的定义中,另一个类的对象是该类的成员变量使用箭头表示,箭头方向表示被包含的类
    如单向关联
class Child
{
private:
    Parent m_father;
};

请添加图片描述

  • 聚合:表示整体与部分的关系,成员对象是整体的一部分,但成员对象也可以托整体对象独立存在,使用空心菱形表示,且由部分指向整体。如
class Plant
{
    // 植物
};

class Animal
{
    // 动物
};

class Water
{
    // 水
};

class Sunshine
{
    // 阳光
};

class Forest
{
public:
    Forest(Plant p, Animal a, Water w, Sunshine s) : 
        m_plant(p),m_animal(a),m_water(w),m_sun(s)
    {
    }
private:
    Plant m_plant;
    Animal m_animal;
    Water m_water;
    Sunshine m_sun;
};


作者: 苏丙榅
链接: https://subingwen.cn/design-patterns/UML-class-diagrams/
来源: 爱编程的大丙
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

表示为
请添加图片描述

  • 组合:与聚合类似也用于表示整体和部分的关系,使用菱形实心箭头表示,但整体对象可以控制成员对象的成名周期,成员对象会随整体对象的析构二析构,即整体的构造函数及析构函数会包含组合关系其他成员对象的new及delete,如
    请添加图片描述

  • 依赖:类在执行某个动作需要使用其他类,使用带箭头的虚线表示,箭头方向指向被依赖被调用的类,如

class Driver 
{
public: 
    void drive(Car car) 
    { 
        car.move(); 
    } 
};

请添加图片描述

类与类关系总结

  • 类之间关系的强弱顺序:继承>组合>聚合>关联>依赖
  • 关联与组合的区别,除了代码形式,理解上关联的两个对象是平等的,聚合的存在整体与部分
  • 类与类之间的关系主要由需求决定,后可以通过代码反映出来,两个类之间并没有必须的关系

七原则

  • 单一职责原则:对一个类的职责进行确定,避免耦合,分离方式需要对需求进行分类,通过分析需求将整体任务分解为多个类分别完成。便于管理及维护。(使用封装保证)
  • 开放封闭原则:在单一职责的基础上,若存在其他的需求,应遵循可扩展不可修改的原则。即对于类来说,扩展是开放的、修改时封闭的。(使用继承及多态保证,通过继承达到扩展,通过多态实现任务更新)
  • 依赖倒转原则:高层模块(上层应用)不依赖于低层模块(如封装好的API或动态库),两者均应依赖于抽象(如类),可理解为上层通过调用可变虚函数或可变变量的类调用低层接口
    抽象(类)不应该依赖细节(具体的操作),细节应该依赖抽象。使用虚函数即为不注重细节,通过使用虚函数在子类中对弗雷虚函数进行重写,实现子类具体的操作
  • 里氏替换原则:子类可以继承父类的功能,但不可代编原有功能,即子类类型应能完全替换或包含父类类型
  • 接口分离原则:类对于接口的依赖应最小化,一个接口中尽量不要存在该类不需要使用的方法或操作。类所依赖的接口中存在冗余的方法,应将接口细化。这也是单一职责原则的一种体现?
  • 迪米特法则:又称最少知道原则,一个对象应对其他对象保持最少的理解。陌生的类最好不要作为局部变量出现类的内部(如在定义操作的函数中)
  • 组合\聚合复用原则:在新的对象内尽量使用已有的对象,使之成为新对象的一部分,实现复用。继承会产生子类对父类的过度依赖,尽量不使用继承。

设计时应充分利用继承封装和多态实现三原则。

分类

根据所设计模式的目的,可分为创造性模式、结构型模式以及行为型模式三种

创建型模式

创造型模式主要用于创建对象,如单例模式以及工厂模式
对类的实例化过程进行了抽象,能将对象的创建和使用分离。外界对于该对象进知道功能及接口,不清楚其中具体的实现细节。使系统更符合单一职责原则

结构型模式

结构型模式用于处理类或对象的组合,如适配器模式
描述了如何将类或者对象结合在一起形成更大的结构。可分为类结构型模式和对象结构型模式,其中类结构型模式中类与类大部分为继承关系。对象结构型模式则用于描述对象与类的组合,一般为关联关系。根据复用原则,设计模式时尽量避免继承,因此大部分结构型模式都是对象结构型模式

行为型模式

行为型模式用于描述对象或类怎样交互和分配职责
关注类和对象之间的相互作用,可分为类行为模式以及对象行为模式
类行为型模式通过继承在几个类之间分配行为,主要通过多态实现
对象行为模式主要通过聚合关联关系分配行为。根据复用原则,设计模式时尽量避免继承,因此大部分行为型模式都是对象行为型模式

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值