七大原则、UML类图

七大设计原则

单一职责模式

  1. 降低类的复杂度,一个类只负责一项职责
  2. 提高类的可读性,可维护性
  3. 降低变更引起的风险
  4. 在类中方法数量足够少时,我们可以在方法级别上保持单一职责原则

接口隔离原则

一个类对另一个类的依赖应该建立在最小的接口

  • 没有使用接口隔离原则的关系图

image-20200627134744275

  • 使用接口隔离原则的关系图

image-20200627135207356


依赖倒转原则

  1. 高层模块不应该以来低层模块,二者都应该依赖其抽象
  2. 抽象(抽象类、接口)不应该依赖细节(实现类),细节应该依赖抽象
  3. 依赖倒转的中心思想是面向接口编程

为什么要面向接口编程?

相对于细节的多变性,抽象的东西更加稳定,以抽象为基础搭建的架构比以细节搭建起来的架构要稳定的多

接口或者抽象类的任务是去制定好规范,把展示细节的任务交给实现类去完成

注意事项:

  • 低层模块尽量都要有抽象类或接口,这样程序的稳定性好
  • 变量的声明类型尽量是抽象类或接口(多态)【 Animal cat = new cat(); 】,这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序的扩展和优化
  • 继承时遵循里氏替换原则
依赖关系传递的3种方式
  • 接口传递

    //打开电视的接口
    interface IOpenTV{
        public void open(ITV tv);
    }
    
    //电视接口
    interface ITV{
        public void play();
    }
    
    //打开电视并播放
    class OpenTv implements IOpenTV{
    
        @Override
        public void open(ITV tv) {
            tv.play();
        }
    }
    
  • 构造方法传递

    interface IOpenTV{
        public void open();
    }
    //电视接口
    interface ITV{
        public void play();
    }
    //打开电视并播放
    class OpenTv implements IOpenTV{
    
        public ITV tv;
    
        //通过构造器传递
        public OpenTv(ITV tv) {
            this.tv = tv;
        }
    
        @Override
        public void open() {
           this.tv.play();
        }
    }
    
  • setter 方式传递

    interface IOpenTV{
        public void open();
        public void setTv(ITV tv);
    }
    //电视接口
    interface ITV{
        public void play();
    }
    //打开电视并播放
    class OpenTv implements IOpenTV{
    
        private ITV tv;
    
        @Override
        public void setTv(ITV tv) {
            this.tv = tv;
        }
    
        @Override
        public void open() {
            this.tv.play();
        }
    }
    

里氏替换原则

继承中要遵守里氏替换原则

在子类中尽量不要重写父类的方法

继承实际上让两个类的耦合性增强了,子类重写了父类的方法会导致在多态的使用中出现问题

为了解决这个问题:

如果子类要重写父类的方法,我们尽量将子类与父类提升到一个更抽象的基类,是两个类之间不再是继承关系,适当情况下,通过聚合,组合,依赖来解决问题。

image-20200627151620742

开闭原则

  1. 开闭原则是编程中最基础、最重要的设计原则,编程中遵循其他原则,使用设计模式的目的就是遵循开闭原则
  2. 一个软件实体(类)模块和函数应该对扩展开放(提供方),对修改关闭(使用方)
  3. 用抽象构建框架,用实现扩展细节
  4. 当软件需求发生变化时,尽量通过扩展来实现变化,而不是通过修改已有的代码来实现变化(尽量增加新的类来实现变化的需求,尽量不动已有的类)

迪米特法则

迪米特法则的核心是降低类之间的耦合(减少不必要的依赖),而不是完全没有依赖关系。

迪米特法则又叫 最少知道原则,即一个类对自己依赖的类知道的越少越好

迪米特法则还有个最简单的定义:只与直接朋友通信

直接朋友:出现在成员变量、方法参数、方法返回值种的类为直接朋友

//其中 B 就是 A 的直接朋友
class A{
    public B b = new B();    
    public B method(B b){    
    }
}

陌生类:以局部变量的形式出现在类的内部

//其中 C 就是 A 的陌生类
class A{
    public B b = new B();
    public B method(B b){
        C c = new C();
    }
}

合成复用原则

只是为了使用某个类中的方法,尽量使用合成/聚合的方式,而不是继承

  • 继承

    image-20200627160709184

  • 依赖【B类中有方法:void method(A a)】

    image-20200627160733099

  • 聚合【B类中有成员变量:public A a; setA】

    image-20200627160803046

  • 组合【B类中有成员变量:public A a = new A()】

    image-20200627160825829

UML 类图

UML(Unified modeling language)统一建模语言,是把自己的思路描述给别人看。

类图是描述类(对象)本身的组成和类(对象)之间的静态关系,是 UML 图中最核心的。

类与类之间的关系:依赖、泛化(继承)、实现、关联、聚合、组合

image-20200627161900019

依赖关系

只要是在类中用到了对方,那么他们之间就存在依赖关系,如果没有对方,编译也无法通过。

  1. 如果是类的成员属性
  2. 如果是方法的返回类型
  3. 是方法接收的参数类型
  4. 方法中使用到

image-20200628083649173

泛化关系

  1. 泛化关系就是继承关系,一种依赖关系的特例。

    image-20200628081640180

实现关系

依赖关系的特例

image-20200628081731467

关联关系

  1. 关联具有导航性(双向关系、单向关系),是依赖关系的特例

    image-20200628082055821

聚合关系

整体与部分可以分离,聚合关系是关联关系的特例

image-20200628082511097

组合关系

整体和部分不可以分离,是关联关系的一种特例

class Person{
    private Head head = new Head();		//这就是组合关系,在new Person的时候,new Head也会进行Person和Head是不能分离的 
    private IDCard card;				   //这就是聚合关系,Person 和 IDCar 是可以分离的
}

image-20200628083249750

但是会存在一个特殊情况:

如果程序中Person实体类中定义了对IDCard进行级联删除,那么此时就是组合关系。

各种关系的联系

	//这就是组合关系,在new Person的时候,new Head也会进行Person和Head是不能分离的 
private IDCard card;				   //这就是聚合关系,Person 和 IDCar 是可以分离的

}


[外链图片转存中...(img-d9gMDH4T-1593924547473)]

> 但是会存在一个特殊情况:
>
> 如果程序中Person实体类中定义了对IDCard进行==级联删除==,那么此时就是组合关系。

### 各种关系的联系

![image-20200628084431993](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9naXRlZS5jb20vRmFuWGluZy00MjkvbXlCbG9nL3Jhdy9tYXN0ZXIvaW1nL2ltYWdlLTIwMjAwNjI4MDg0NDMxOTkzLnBuZw?x-oss-process=image/format,png)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值