首页 > 编程语言 >「全网最细 + 实战源码案例」设计模式——六大设计原则

「全网最细 + 实战源码案例」设计模式——六大设计原则

时间:2025-01-21 18:24:18浏览次数:1  
标签:最细 对象 double void 接口 class 源码 设计模式 public

目的

提高软件系统的可维护性和可复用性,增加软件的可拓展性和灵活性,程序员遵循 6 条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。


开闭原则(OCP)

核心思想

1. 对拓展开放

  • 软件模块应该在不修改原有代码的情况下,通过扩展的方式增加新功能。
  • 目标:提高系统的可拓展性,适应不断变化的需求。

2. 对修改关闭

  • 在新增需求时,尽量避免修改现有代码。
  • 目标:降低由于修改代码引发的潜在问题,提高系统的稳定性。

实现方式

1. 使用抽象

  • 通过定义接口或抽象类,让具体实现依赖于抽象,而不是直接依赖具体类。
  • 增加新功能时,实现新的子类,不需要修改原有类。

2. 多态机制

  • 借助继承与多态,在运行时决定调用哪个具体类实现。

示例

AbstractSkin:

// 皮肤抽象类
public abstract class AbstractSkin {

    public abstract void display();

}

DefaultSpecificSkin:

// 默认皮肤
public class DefaultSpecificSkin extends AbstractSkin{

    @Override
    public void display() {
        System.out.println("默认皮肤.....");
    }
}

SupermanSpecificSkin:

// 超级英雄皮肤
public class SupermanSpecificSkin extends AbstractSkin{
    @Override
    public void display() {
        System.out.println("超人皮肤.....");
    }
}

SougouInput:

// 搜狗输入法
public class SougouInput {

    private AbstractSkin skin;

    public void setSkin(AbstractSkin skin) {
        this.skin = skin;
    }

    public void display() {
        skin.display();
    }
}

Client:

public class Client {
    public static void main(String[] args) {

        // 1.创建搜狗输入法对象
        SougouInput input = new SougouInput();

        // 2.创建皮肤对象
//        AbstractSkin skin = new SupermanSpecificSkin();
        AbstractSkin skin = new DefaultSpecificSkin();

        // 3.设置皮肤
        input.setSkin(skin);

        // 4.显示皮肤
        input.display();
    }
}

里氏代换原则(LSP)

核心思想

子类对象应该能够替代父类对象出现在程序中的位置,并且程序的行为不会因此受到影响。(一个程序使用父类的对象,那么在不改变程序行为的前提下,子类对象可以替代父类对象)。


实现方式

1. 子类不应该改变父类方法的预期行为,尽量保留父类的方法逻辑。

2. 方法的输入输出应符合父类的契约,子类应遵循父类的行为约定。

3. 使用接口或抽象类设计,可以减少子类对父类的依赖。

4. 确保子类与父类的行为一致性,避免引入错误或不一致的行为。


示例

Quadrilateral

// 四边形接口
public interface Quadrilateral {

    double getLength();
    double getWidth();
}

Rectangle

// 矩形类
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;
    }
}

Square

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;
    }
}

RectangleDemo

public class RectangleDemo {

    public static void main(String[] args) {

        // 1.创建长方形对象
        Rectangle rectangle = new Rectangle();

        // 2.设置长和宽
        rectangle.setLength(20);
        rectangle.setWidth(10);

        // 3.调用扩宽方法
        resize(rectangle);

        // 4.打印长和宽
        printLengthAndWidth(rectangle);
    }

    // 扩宽方法
    public static void resize(Rectangle rectangle){
        while (rectangle.getLength() >= rectangle.getWidth()){
            rectangle.setWidth(rectangle.getWidth() + 1);
        }
    }

    // 打印长和宽
    public static void printLengthAndWidth(Quadrilateral quadrilateral){
        System.out.println("长:" + quadrilateral.getLength() + " 宽:" + quadrilateral.getWidth());
    }

}

依赖倒转原则(DIP)

核心思想:

  • 高层模块(负责实现核心业务逻辑的模块)不应该依赖低层模块(负责实现具体的细节,比如数据存储、网络通信),二者应该依赖抽象。
  • 抽象(接口或抽象类)不应该依赖细节(具体实现类),细节应该依赖抽象。
  • 若没有遵循 DIP,高层模块直接依赖于低层模块,使得两者耦合度变高,且低层模块的变化可能会直接影响到高层模块,从而增加了系统的复杂性和维护难度。
  • DIP 的关键在于,将高层模块与低层模块之间的依赖关系通过抽象接口或抽象类来分离,从而减少直接耦合,增加系统的灵活性。

示例

CPU

// 抽象CPU接口
public interface CPU {
    // 运行cpu
    void run();
}

HardDisk

// 硬盘接口
public interface HardDisk {

    // 存储数据
    void save(String data);
    // 获取数据
    String get();
}

Memory

// 内存条接口
public interface Memory {

    void save();
}

IntelCpu

// 英特尔CPU
public class IntelCpu implements CPU{
    @Override
    public void run() {
        System.out.println("英特尔CPU运行");
    }
}

XiJieHardDisk

// 希捷硬盘
public class XiJieHardDisk implements HardDisk{
    @Override
    public void save(String data) {
        System.out.println("希捷硬盘保存数据为:" + data);
    }

    @Override
    public String get() {
        System.out.println("希捷硬盘读取数据");
        return "数据";
    }
}

KingstonMemory

// 金士顿内存条
public class KingstonMemory implements Memory{
    @Override
    public void save() {
        System.out.println("金士顿内存条");
    }
}

Computer

public class Computer {

    private HardDisk hardDisk;
    private CPU cpu;
    private Memory memory;

    public HardDisk getHardDisk() {
        return hardDisk;
    }

    public void setHardDisk(HardDisk hardDisk) {
        this.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 void run() {
        System.out.println("计算机开始运行...");
        String data = hardDisk.get();
        System.out.println("从硬盘中获取数据:" + data);
        cpu.run();
        memory.save();
    }
}

ComputerDemo

public class ComputerDemo {

    public static void main(String[] args) {

        // 1.创建计算机对象
        Computer computer = new Computer();

        // 2.创建计算机组件对象
        HardDisk hardDisk = new XiJieHardDisk();
        CPU cpu = new IntelCpu();
        Memory memory = new KingstonMemory();

        // 3.设置计算机组件
        computer.setHardDisk(hardDisk);
        computer.setCpu(cpu);
        computer.setMemory(memory);

        // 4.运行计算机
        computer.run();
    }
}

接口隔离原则(ISP)

核心思想

  • 不应该强迫一个类依赖于它不需要的接口。(客户端不应被迫实现它不使用的方法)
  • 接口的设计应该小而精,每个接口只包含一组相关的功能,避免一个大型接口包含不相关的方法,从而导致实现类必须实现他们(即使不需要)
  • 这个原则旨在通过拆分接口,使得类只依赖于它实际需要的接口,避免出现类与接口之间的强耦合。

示例


迪米特法则(LoD)

核心思想

  • 一个对象应该对其他对象有最少的了解,即一个对象应该只和它直接相关的对象进行交互,而不应该依赖于它的“朋友”的“朋友”或其他间接对象。
  • 又称最少知识原则,如果两个软件实体无需直接通信,那么就不应该发生直接的相互调用,可以通过第三方转发该调用,以此降低类之间的耦合度,提高模块的相对独立性。
  • 直接的朋友对象:
    • 当前对象本身
    • 当前对象的成员对象
    • 当前对象所创建的对象
    • 当前对象的方法参数等
    • 同当前对象存在关联、聚合和组合关系的对象。

示例


合成复用原则(CARP)

核心思想:

  • 尽量使用对象的组合(聚合)来实现功能复用,而不是通过继承来扩展功能。
  • 组合:一个对象作为另一个对象的成员,通过成员变量引用实现功能的复用。
  • 聚合:一个对象与另一个对象之间通过外部关联实现松散耦合,体现的是“部分-整体”关系。
  • 继承虽是一种复用代码的有效手段,但它是一种强耦合的复用方式,子类过多依赖父类实现,导致灵活性降低。
  • 组合/聚合可以使模块间的耦合度降低,组件可以自由组合,从而提高系统的可扩展性和可维护性。

示例

标签:最细,对象,double,void,接口,class,源码,设计模式,public
From: https://www.cnblogs.com/cikiss/p/18684061

相关文章

  • 「全网最细 + 实战源码案例」设计模式——单例设计模式
    核心思想:属于创建型设计模式,核心目的是确保一个类在整个程序运行期间只有一个实例,并提供一个全局访问点来获取该实例。控制共享资源的访问(如数据库链接、配置管理、日志处理器等)真实世界类比:政府是单例模式的一个很好的示例。一个国家只有一个官方政府。不管组成政府的每个......
  • 计算机毕业设计—03073 SSM电影推荐系统(源码免费领)
                                 摘  要Abstract第1章  前  言1.1 研究背景1.2 研究现状1.3 系统开发目标第2章  技术与原理2.1开发技术22.2ssm框架介绍22.3MySQL数据库22.4B......
  • 2025毕设springboot 基于的热点新闻搜索系统论文+源码
    系统程序文件列表开题报告内容研究背景在信息爆炸的时代,新闻作为传递信息、反映社会动态的重要载体,其传播速度和覆盖范围日益扩大。随着互联网的普及和移动设备的广泛应用,人们获取新闻的方式已经从传统的报纸、电视逐渐转向在线平台。热点新闻作为公众关注的焦点,具有极高的......
  • 2025毕设springboot 基于的牵手沟通网站的设计与实现论文+源码
    系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,人与人之间的沟通交流方式正经历着前所未有的变革。在这个信息爆炸的时代,人们渴望找到更加便捷、高效且富有情感的沟通平台。传统的沟通方式,如面对面交流或电话沟通,虽然直接,但在时间和空间上存在一定的局限性......
  • 2025毕设springboot 基于的农产品批发服务系统论文+源码
    系统程序文件列表开题报告内容研究背景在农业现代化与信息化快速发展的背景下,农产品批发服务作为连接农业生产者与消费者的关键环节,其效率与透明度直接影响着农产品的流通速度与市场响应能力。传统的农产品批发模式往往依赖于实体市场,存在着信息不对称、交易成本高、物流效......
  • 【VOS源码解析-2024CVPR-Cutie】1、train_wrapper结构解析
    源码解析论文阅读1、数据预处理2、视频帧特征提取2.1pixelencoder特征提取2.2tranformer_key2.3特征图维度转换论文阅读原文阅读笔记githubarxiv地址训练框架1、train.py概览2、trainner.py概览model主体框架1、train_wrapper1、数据预处理d......
  • [免费]SpringBoot+Vue问卷调查管理系统【论文+源码+SQL脚本】
    大家好,我是java1234_小锋老师,看到一个不错的SpringBoot+Vue问卷调查管理系统,分享下哈。项目视频演示【免费】SpringBoot+Vue问卷调查管理系统Java毕业设计_哔哩哔哩_bilibili项目介绍传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发......
  • 一个由 Go 语言开发的开源屏幕共享工具,免费好用,高质量无延迟,保证数据安全(带私活源码)
    想必大家在日常的工作中,会经常需要分享代码、演示项目或者进行在线教学,这就需要一个既高效又便捷的屏幕共享工具。然而,现有的一些解决方案往往存在延迟高、画质差等问题。今天就分享一个开源的屏幕共享项目-screego,不但免费,还能在我们自己的服务器上运行,保证数据安全。项......
  • 基于springboot的高校毕业生就业信息管理系统(源码+lw+部署文档+讲解等)
    背景及意义基于Java+SpringBoot的高校毕业生就业信息管理系统是一个功能强大的信息管理平台,旨在为高校的就业工作提供全面支持。该系统通过Java语言的强大功能和SpringBoot的便捷开发框架,将涵盖多个重要模块。其中包括毕业生信息管理,能详细记录毕业生的基本信息......
  • 基于springboot的高考志愿智能推荐系统(源码+lw+部署文档+讲解等)
    背景及意义基于Java+SpringBoot的高考志愿智能推荐系统旨在为高考生提供科学、个性化的志愿填报辅助服务。该系统利用Java的强大编程能力和SpringBoot的便捷开发特性,能够高效实现功能。首先,它会收集考生的各项信息,如高考成绩、学科兴趣、地域偏好等。通过复杂的......