首页 > 其他分享 >设计模式---六大设计原则

设计模式---六大设计原则

时间:2022-09-19 22:23:42浏览次数:73  
标签:六大 int res void System --- num println 设计模式

六大设计原则

  1. 单一职责原则
  2. 接口隔离原则
  3. 开闭原则
  4. 依赖倒置原则
  5. 里氏代换原则
  6. 迪米特法则

单一职责原则

我们分别看两个案例,一个是遵守单一职责原则,另一个是违背。

违背的案例

class Computer {
    void calc() {
        System.out.println("计算数据"); // 基本功能,么得问题
    }
    void display() {
        System.out.println("显示计算结果"); // 现在的计算机确实有显示功能
    }
    void run() {
        System.out.println("以百米冲刺的速度奔跑"); // 这什么玩意儿?这个类到底是干嘛的
    }
}

遵守的案例

class Computer {
    void calc() {
        System.out.println("计算数据"); // 基本功能,么得问题
    }
    void display() {
        System.out.println("显示计算结果"); // 现在的计算机确实有显示功能
    }
}
class Humam {
    void run() {
        System.out.println("以百米冲刺的速度奔跑"); // 人会跑不是很正常嘛
    }
}

单一职责的核心:限制类的职责范围,杜绝功能复杂的类的产生
接口隔离原则也是同样的思想,就不废话了。

开闭原则

class Style {
    public void set() {
        System.out.println("设置圆角");
    }
}

当需要改变样式的时候。不遵守开闭原则的做法。

class Style {
    public void set() {
        // System.out.println("设置圆角");
        System.out.println("设置order");
        /* 
        	直接修改原有的方法上做修改
         */
    }
}

而遵守开闭原则的做法。

// 将原有的Style类抽象成接口,这样对客户端也没有影响,
// 因为用的还是Style并没有改名,只是原来是个类,现在变成了接口
interface Style {
    void set();
}
class Radius implements Style {
    public void set() {
        System.out.println("设置圆角");
    }
}
class Order implements Style { // 不对原有的实现类修改,而是增加一个新个实现类
    public void set() {
         System.out.println("设置order");
    }
}

开闭原则的核心:对修改关闭,对拓展开放
不在原有的代码上增减新的代码,而是添加新的模块。核心要点是面向接口编程。

依赖倒置原则

不符合依赖倒置原则的案例。

class Radius {
    public void set() {
        System.out.println("设置圆角");
    }
}
class Order {
    public void set() {
        System.out.println("设置order");
    }
}
class Client {
    public void setRadius(Radius radius) {
        adius.set();
    }
    public void setOrder(Order order) {
        rder.set();
    }
}

符合依赖倒置原则的案例。

interface Style {
    void set();
}
class Radius implements Style {
    public void set() {
        System.out.println("设置圆角");
    }
}
class Order implements Style {
    public void set() {
        System.out.println("设置order");
    }
}
class Client {
    public void setStyle(Style style) {
        style.set();
    }
}

依赖倒置的核心:从依赖具体类变为依赖抽象或接口。面向接口编程。

里氏代换原则

不符合里氏代换原则的案例。

class CacheCard {
    protected int balance;
    public void peek() {
        System.out.println("余额:" + balance);
    }
    public void deposit(int num) {
        balance += num;
        System.out.println("存款金额:" + num);
        peek();
    }
    public void withdraw(int num) {
        balance += num;
        System.out.println("取款金额:" + num);
        peek();
    }
}
class CreditCard extends CacheCard {
    public void deposit(int num) { // 信用卡并没有存钱这个功能,不应该重写
        balance += num;
        System.out.println("还款金额:" + num);
        peek();
    }
    public void withdraw(int num) { // 也没有取款的功能,不应该重写
        balance += num;
        System.out.println("支付金额:" + num);
        peek();
    }
}

符合里氏代换原则的案例。

interface BankCard {
    int balance;
    default void peek() {
        System.out.println("余额:" + balance);
    }
    void positive(int num);
    void negative(int num);
}
class CacheCard implements BankCard {
    public void positive(int num) {
        balance += num;
        System.out.println("存款金额:" + num);
        peek();
    }
    public void negative(int num) {
        balance -= num;
        System.out.println("取款金额:" + num);
        peek();
    }
}
class CreditCard implements BankCard {
    public void positive(int num) {
        balance += num;
        System.out.println("还款金额:" + num);
        peek();
    }
    public void negative(int num) {
        balance -= num;
        System.out.println("支付金额:" + num);
        peek();
    }
}

里氏代换原则的核心思想:使用父类能够实现的功能,使用其子类依旧能实现。限制方法重写的范围,从业务的角度出发我们只可以重写父类中被允许重写的方法,而不是从Java语法角度(那能重写的多了去了)出发重写方法。

迪米特法则

不符合迪米特法则的案例。

class Student {
    String name;
    String sex;
    int score;
}
class Teacher {
    String name;
    String sex;
    Student[] students;
    int max() {
        int res = 0;
        for (student : students) {
            res = Math.max(res, student.score);
        }
        return res;
    }
    int min() {
        int res = 0;
        for (student : students) {
            res = Math.min(res, student.score);
        }
        return res;
    }
}
class President {
    String name;
    String sex;
    Student[] students; // 不应该依赖Student类,而应该依赖Teacher类,将所有对于students的操作封装到Teacher类中
    Teacher[] teachers;
    int avg() { // 这个方法应该在Teacher中定义
        int res = 0;
        for (student : students) {
            res += student.score;
        }
        return res / students.length;
    }
    String[] teachersName() { // 获取所有的老师名字
        String[] res = new String[teachers.length];
        for (int i = 0; i < res.length; i ++) {
            res[i] = teachers[i].name;
        }
        return res;
    }
}

符合迪米特法则的案例。

class Student {
    String name;
    String sex;
    int score;
}
class Teacher {
    String name;
    String sex;
    Student[] students;
    int max() {
        int res = 0;
        for (student : students) {
            res = Math.max(res, student.score);
        }
        return res;
    }
    int min() {
        int res = 0;
        for (student : students) {
            res = Math.min(res, student.score);
        }
        return res;
    }
    int avg() { // 这个方法应该在Teacher中定义
        int res = 0;
        for (student : students) {
            res += student.score;
        }
        return res / students.length;
    }
}
class President {
    String name;
    String sex;
    Teacher[] teacher; // 依赖Teacher类
    int[] avgs() { // 获取每个班级的平均分
        int[] res = new int[teacher.length];
        for (int i = 0; i < res.length; i ++) {
            res[i] = teacher[i].avg(); // 实际计算调用Teacher内的计算
        }
        return res;
    }
    String[] teachersName() { // 获取所有的老师名字
        String[] res = new String[teachers.length];
        for (int i = 0; i < res.length; i ++) {
            res[i] = teachers[i].name;
        }
        return res;
    }
}

迪米特法则的核心思想:最少知道,最少依赖。类的定义应当把对于其他类的依赖降到最低。
遵守迪米特法则的同时也基本满足了单一职责原则。

标签:六大,int,res,void,System,---,num,println,设计模式
From: https://www.cnblogs.com/buzuweiqi/p/16695108.html

相关文章

  • CSP-J 2022 备战 乱七八糟字符串
     众所周知,字符串分为两大类:一.string类:主要操作:1.字符串长度输出:str.length()2.字符串比较:str1.compare(str2)如果结果是0则两个字符串完全相同3.字符串判空:str.em......
  • 【vue3】element-plus组件国际化随时切换语言
    背景我们可以通过ui组件库来统一调整组件的语言设置,比如统一设置成中文或者英文步骤引入element-plus相关的语言包。这里使用中文通过el-config-provider组件进行配......
  • CSP-S模拟6
    从今往后,教室里再也没有我们的一席之地了**希望我高中毕业之前再也不要回去***A.玩水针对n=2的数据点思考了一下,发现了对角线这个事,于是我就判断的一下能找到两个对角线......
  • PHP编辑报错/lib64/liblber-2.4.so.2: could not read symbols: Invalid operation
    问题:/usr/bin/ld:ext/ldap/.libs/ldap.o:undefinedreferencetosymbol'ber_scanf'/usr/bin/ld:note:'ber_scanf'isdefinedinDSO/lib64/liblber-2.4.so.2......
  • 软考-高项-合同法、著作权、实施条例
    合同法第九条:当事人订立合同,应当具有相应的民事权利能力和民事行为能力第十条:当事人订立合同,有书面形式、口头形式和其他形式第十一条:书面形式是指合同书、信件和数据电......
  • MySQL-索引
    MYSQL之索引本章包含索引概述,索引结构,索引语法,索引分类,SQL性能分析,索引使用,索引设计原则!索引概述介绍(1)索引(index)是帮助MySQL高效获取数据的数据结构(有序)。......
  • centos7镜像部署的php-fpm的9000端口无法被外部访问
    问题:用docker部署了源码安装的php,想试试让外部访问9000端口,发现无法访问,在宿主机telnetdocker的ip9000也是无法访问的解决办法:修改php的php-fpm.conf原来listen=......
  • CMU15-445 FALL 2022 PROJECT #1 - BUFFER POOL
    CMU15-445PROJECT#1-BUFFERPOOL前言终于来到了Project#1了,这次是要实现三个组件,分别是ExtendibleHashTable,LRU-KReplacementPolicy,BufferPoolManage......
  • docker run的--rm选项详解
    在Docker容器退出时,默认容器内部的文件系统仍然被保留,以方便调试并保留用户数据。因此,可以通过--rm命令,让容器在退出时,自动清除挂载的卷,以便清除数据:另外,当容器退出时,通过......
  • blog 2 Objects, state, behavior in real-world
     1.创建变量并命名它们变量对象将其状态存储在字段中。Java编程语言定义了以下类型的变量:实例变量(非静态字段)从技术上讲,对象将其各个状态存储在“非静态字段”中,......