Java设计模式中的设计原则/开闭原则、里氏代换原则和依赖倒转原则又是什么,怎么用

news2024/12/23 14:35:54

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用!

3.设计原则

3.1 目的

  • 提高软件系统可维护性与可复用性
  • 增加软件可扩展性与灵活性
  • 节约开发成本与维护成本

3.2 开闭原则

3.2.1 特点

  • 对扩展开放,对修改关闭
  • 使用接口及抽象类
  • 若需要直接派生实现类即可

3.2.2 案例(搜狗皮肤更换功能)

  • 抽象类代码
public abstract class AbstractSkin {  
    public abstract void display();  
}
  • 默认皮肤代码
public class defaultSkin extends AbstractSkin{  
    @Override  
    public void display() {  
        System.out.println("默认皮肤");  
    }  
}
  • 自定义皮肤代码
public class mySkin extends AbstractSkin{  
    @Override  
    public void display() {  
        System.out.println("我的皮肤");  
    }  
}
  • 输入法对象代码
public class souGouInput {  
    public AbstractSkin skin;  
    public void setSkin(AbstractSkin skin) {  
        this.skin = skin;  
    }  
    public void display(){  
        skin.display();  
    }  
}
  • 测试代码
    public static void main(String[] args) {  
//        创建对象  
        souGouInput souGouInput = new souGouInput();  
//        创建皮肤对象  
//        defaultSkin defaultSkin = new defaultSkin();  
        mySkin mySkin = new mySkin();  
//        加载皮肤  
//        souGouInput.setSkin(defaultSkin);  
            souGouInput.setSkin(mySkin);  
//        使用皮肤,更改皮肤不需要改皮肤代码,只需要额外创建派生皮肤并加载进去即可
        souGouInput.display();  
    }
  • 关系图如图![[Pasted image 20221226163048.png]]

3.3 里氏代换原则

3.3.1 特点

  • 子类可以扩展父类功能,但不能改变原有父类功能

3.3.2 案例(正方形不是长方形)

3.3.2.1 正方形不是长方形子类

  • 长方形类:两个属性,宽度和高度;正方形类:一个属性,边
  • 设定一个resize方法,一直增加长方形的宽度,直到增加到宽度超过高度才可以
  • 若子类正方形的对象调用resize方法,这个方法会导致正方形的边不断地增加下去,直到溢出为止,违反里氏代换原则

3.3.2.2 解决

  • 四边形接口代码
public interface Quadrilateral {  
    double getLength();  
    double getWidth();  
}
  • 长方形实现类代码
public class Rectangle implements Quadrilateral  
{  
    private double length;  
    private double width;  
    public void setLength(double length) {  
        this.length = length;  
    }  
    public void setWidth(double width) {  
        this.width = width;  
    }  
    @Override  
    public double getLength() {  
        return length;  
    }  
    @Override  
    public double getWidth() {  
        return width;  
    }  
}
  • 正方形实现类代码
public class Square implements Quadrilateral{  
    private double side;  
    public double getSide() {  
        return side;  
    }  
    public void setSide(double side) {  
        this.side = side;  
    }  
    @Override  
    public double getLength() {  
        return side;  
    }  
    @Override  
    public double getWidth() {  
        return side;  
    }  
}
  • 测试代码
public class test {  
    public static void main(String[] args) {  
//        创建长方形对象  
        Rectangle r = new Rectangle();  
        r.setLength(20);  
        r.setWidth(10);  
//        调用扩宽  
        resize(r);  
        printMessage(r);  
    }  
    //    扩宽  
    public static void resize(Rectangle r)  
    {  
//        若长比宽大,使宽增长  
        while(r.getLength() > r.getWidth())  
        {  
            r.setWidth(r.getWidth()+1);  
        }  
    }  
    public static void printMessage(Quadrilateral q)  
    {  
        System.out.println(q.getLength());  
        System.out.println(q.getWidth());  
    }  
}

3.4 依赖倒转原则

3.4.1 特性

  • 高层模块和底层模块均依赖于抽象
  • 细节依赖抽象
  • 对抽象编程

3.4.2 案例(组装电脑)

  • CPU接口及实现类代码
public interface CPU {  
//    运行CPU  
    public void run();  
}
public class InterlCPU implements CPU  
{  
    @Override  
    public void run() {  
        System.out.println("使用IntelCPU ");  
    }  
}
  • Memory接口及实现类代码
public interface Memory {  
    public void save();  
}
public class KingStonMemory implements Memory{  
    @Override  
    public void save() {  
        System.out.println("使用金士顿内存条");  
    }  
}
  • HardDisk接口及实现类代码
public interface HardDisk {  
//    存储数据  
    public void save(String data);  
    public String get();  
}
public class XiShuHardDisk implements HardDisk{  
    @Override  
    public void save(String data) {  
        System.out.println("使用西数硬盘存储数据为:"+data);  
    }  
    @Override  
    public String get() {  
        System.out.println("从西数硬盘获取数据");  
        return "数据";  
    }  
}
  • Computer类代码
public class Computer {  
    public CPU cpu;  
    public Memory memory;  
    public HardDisk hardDisk;  
    public CPU getCpu() {  
        return cpu;  
    }  
    public void setCpu(CPU cpu) {  
        this.cpu = cpu;  
    }  
    public Memory getMemory() {  
        return memory;  
    }  
    public void setMemory(Memory memory) {  
        this.memory = memory;  
    }  
    public HardDisk getHardDisk() {  
        return hardDisk;  
    }  
    public void setHardDisk(HardDisk hardDisk) {  
        this.hardDisk = hardDisk;  
    }  
//    运行计算机  
    public  void run()  
    {  
        System.out.println("运行计算机");  
        String data = hardDisk.get();  
        System.out.println("从硬盘获取数据为:" + data);  
        cpu.run();  
        memory.save();  
    }  
}
  • 测试类代码
public class test {  
    public static void main(String[] args) {  
//        创建组件对象  
        HardDisk hardDisk = new XiShuHardDisk();  
        CPU cpu = new InterlCPU();  
        Memory memory = new KingStonMemory();  
//        创建计算机对象  
        Computer computer = new Computer();  
//        组装  
        computer.setCpu(cpu);  
        computer.setHardDisk(hardDisk);  
        computer.setMemory(memory);  
//        运行  
        computer.run();  
    }  
}
  • 关系图在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/147410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实战干货|自研数据存储迁移MySQL实战

背景 最近公司内部在做某自研数据存储的下线工作,这里我们暂且化名其为DistributeSQL,由于DistributeSQL不再进行服务支持,需要迁移项目中使用到该存储到其他数据存储中。 本篇来聊聊这次在数据存储迁移过程中的方案设计思路、实现的大致细节…

中老年服装电商小程序开发

近年来,随着网络的发展,中老年服装电商小程序开发有了很大的进步。这种平台不仅可以方便用户购买到最新最时尚的产品,而且还能帮助商家提高销售业绩。 1:中老年服装电商小程序开发的优势 中老年人对商品信息需求大、容易接受新鲜…

实验⼀:Windows主机漏洞利⽤攻击实践

永恒之蓝简介 永恒之蓝(Eternal Blue)爆发于2017年4月14日晚,是一种利用Windows系统的SMB协议漏洞来获取系统的最高权限,以此来控制被入侵的计算机。甚至于2017年5月12日, 不法分子通过改造“永恒之蓝”制作了wannacry…

【ROS】—— ROS重名问题(九)

文章目录前言1. ROS工作空间覆盖2. ROS节点名称重名2.1 rosrun设置命名空间与重映射2.1.1 rosrun设置命名空间2.1.2 rosrun名称重映射2.1.3 rosrun命名空间与名称重映射叠加2.2 launch文件设置命名空间与重映射2.3 编码设置命名空间与重映射2.3.1 重映射2.3.2 C 实现:命名空间3…

Maven基础学习——依赖配置(1):配置同一项目下的三个工程

依赖配置一、前言二、创建第一个工程三、新建第二个工程四、创建第三个工程五、配置1.每个工程的.xml文件2.文件配置六、结语一、前言 在讲述依赖配置时,需要使用实例来说明,在B站黑马课程(第12小节)中没有讲到如何配置基础的三个…

[Effective Objective] 熟悉Objective-C

了解 Objective-C Objective_C 是一种面向对象的语言。但与jave、C等语言不同,它使用了消息结构(messaging structure)而非函数调用(function calling)。Objective-C由Smalltalk演化而来,后者是消息语言的…

React 学习笔记总结(六)

文章目录1. redux 介绍2. redux 工作流程3. redux 的使用4. redux 完整结构补充5. redux的 异步action6. react-redux库 与 redux库7. react-redux库的 实战8. react-redux的connect 最精简写法9. react-redux的 Provider组件作用10. react-redux 整合UI组件 和 容器组件11. re…

webgl图形平移、缩放、旋转

文章目录前言平移图示代码示例缩放图示代码示例旋转公式推导代码示例总结前言 在webgl中将图形进行平移、旋转、缩放的操作称为变换或仿射变换,图形的仿射变换涉及到顶点位置的修改,通过顶点着色器是比较直接的方式。本文通过着色器实现对webgl图形的仿…

ArcGIS基础实验操作100例--实验65按字段调整点符号方向

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验65 按字段调整点符号方向 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…

计算机组成原理_总线

计算机组成原理总目录总线概述 1. 总线介绍 我们知道计算机中有CPU、主存、辅存,以及打印机、键盘、鼠标等等的一些外设 那么各个设备之间肯定是要进行数据传输的,这就需要许多线路将它们连接起来 第一种方法:两两相联 外设数量越多&#xf…

35、基于STM32的电子钟(DS1302)

编号:35 基于STM32的电子钟(DS1302) 功能描述: 本设计由STM32单片机液晶1602按键DS1302时钟组成。 1、采用STM32F103最小系统。 2、利用DS1302芯片提供时钟信号 3、液晶1602实时显示年月日、时分秒、星期等信息。 4、三个按键可…

隐形AR眼镜厂商Mojo Vision裁员75%,专注Micro LED技术

1月7日青亭网报道,隐形AR眼镜厂商Mojo Vision官方宣布了一项重大调整,其中因为产品进展问题,同时还有融资进展受阻等面临大裁员,将进行一系列中心调整,据了解本次裁员比例高达75%。重点关注:1,M…

【Day5】力扣第328题,奇偶链表

前言: 大家好,我是良辰丫🚀🚀🚀,今天带大家刷一个力扣链表题,有人可能会说,一道题够嘛,刚开始刷题别着急,毕竟,心急吃不了热豆腐,&…

Mathorcup数学建模竞赛第六届-【妈妈杯】B题:小区车位分布的评价和优化模型(附特等奖获奖论文和Java代码)

赛题描述 随着现代社会经济的快速发展,房地产成为国家经济发展中重要的经济增长点之一。而小区内汽车停车位的分布对于小区居民的上下班出行影响很大。请建立数学模型,解决下列问题: 问题1:分析评判小区汽车停车位分布是否合理的几个关键指标,建立评判车位分布合理的数学…

嵌入式Linux-对子进程的监控

1. 进程的诞生与终止 1.1 进程的诞生 一个进程可以通过 fork()或 vfork()等系统调用创建一个子进程,一个新的进程就此诞生!事实上,Linux系统下的所有进程都是由其父进程创建而来,譬如在 shell 终端通过命令的方式执行一个程序./…

leetcode 1658. 将 x 减到 0 的最小操作数[python3 双指针实现与思路整理]

题目 给你一个整数数组 nums 和一个整数 x 。每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值。请注意,需要 修改 数组以供接下来的操作使用。 如果可以将 x 恰好 减到 0 ,返回 最小操作数 &a…

HTML与CSS基础(四)—— CSS基础(选择器进阶、Emmet语法、背景属性、元素显示模式、三大特性)

一、选择器进阶目标:能够理解 复合选择器 的规则,并使用 复合选择器 在 HTML 中选择元素1. 复合选择器1.1 后代选择器:空格作用:根据 HTML 标签的嵌套关系,选择父元素 后代中 满足条件的元素 选择器语法:选…

第二章JavaWeb基础学习路线

文章目录什么是Java WebJava Web基础的技术栈关于我们的客户端与服务端(BS)我们客户端的形式**PC端网页****移动端**服务端应用程序关于请求(request)和响应(response)类比生活中的请求和响应服务器中的请求和响应项目的逻辑构成架…

CSS权威指南(六)文字属性

1.缩进和行内对齐 (1)缩进文本(text-indent) text-indent属性把元素的第一行文本缩进指定的长度,缩进的长度可以可以是负值。这个属性通常用于缩进段落的第一行。text-indent作用于块级元素之上,缩进将沿着…

config:配置中心

Spring Cloud Config 为分布式系统中的外部配置提供服务器端和客户端支持。使用 Config Server,您可以集中管理所有环境中应用程序的外部配置。 Spring Cloud Config就是一个配置中心,所有的服务都可以从配置中心取出配置,而配置中心又可以从…