首页 > 编程语言 >Java设计模式之七大设计原则

Java设计模式之七大设计原则

时间:2023-12-18 14:11:59浏览次数:57  
标签:之七大 Java 原则 double void println return 设计模式 public

七大设计原则

设计原则概述

image-20231205202613963

单一职责原则

定义

一个类仅有一个引起它变化的原因

分析

image-20231205202755237

模拟场景

访客用户 普通用户 VIP用户

代码实现

/**
 * 视频用户接口
 */
public interface IVideoUserService {
​
    void definition();
​
    void advertisement();
}
​
/**
 * 访客用户
 */
public class GuestVideoUserService implements IVideoUserService {
​
    public void definition() {
        System.out.println("访客用户,视频480P高清");
    }
​
    public void advertisement() {
        System.out.println("访客用户,视频有广告");
    }
​
}
/**
 * 普通用户
 */
public class OrdinaryVideoUserService implements IVideoUserService {
​
    public void definition() {
        System.out.println("普通用户,视频720P超清");
    }
​
    public void advertisement() {
        System.out.println("普通用户,视频有广告");
    }
}
/**
 * VIP用户
 */
public class VipVideoUserService implements IVideoUserService {
​
    public void definition() {
        System.out.println("VIP用户,视频1080P蓝光");
    }
​
    public void advertisement() {
        System.out.println("VIP会员,视频无广告");
    }
}
public class Client {
​
    public static void main(String[] args) {
        // 访客用户
        GuestVideoUserService guest = new GuestVideoUserService();
        guest.definition();
        guest.advertisement();
​
        // 普通用户
        OrdinaryVideoUserService ordinary = new OrdinaryVideoUserService();
        ordinary.definition();
        ordinary.advertisement();
​
        //VIP用户
        VipVideoUserService vip = new VipVideoUserService();
        vip.definition();
        vip.advertisement();
​
    }
​
}

开闭原则

定义

对扩展开放,对修改关闭

也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。

分析

image-20231205205219706

模拟场景

求面积,对π精度要求不同

代码实现

/**
 * 面积计算实现
 */
public class CalculationArea implements ICalculationArea {
​
    private final static double π = 3.14D;
​
    public double rectangle(double x, double y) {
        return x * y;
    }
​
    public double triangle(double x, double y, double z) {
        double p = (x + y + z) / 2;
        return Math.sqrt(p * (p - x) * (p - y) * (p - z));
    }
​
    public double circular(double r) {
        return π * r * r;
    }
​
}
/**
 * 扩展继承,实现自己的需求
 */
public class CalculationAreaExt extends CalculationArea {
​
    private final static double π = 3.141592653D;
​
    @Override
    public double circular(double r) {
        return π * r * r;
    }
​
}
/**
 *  面积计算接口
 */
public interface ICalculationArea {
​
    /**
     * 计算面积,长方形
     *
     * @param x 长
     * @param y 宽
     * @return 面积
     */
    double rectangle(double x, double y);
​
    /**
     * 计算面积,三角形
     * @param x 边长x
     * @param y 边长y
     * @param z 边长z
     * @return  面积
     *
     * 海伦公式:S=√[p(p-a)(p-b)(p-c)] 其中:p=(a+b+c)/2
     */
    double triangle(double x, double y, double z);
​
    /**
     * 计算面积,圆形
     * @param r 半径
     * @return 面积
     *
     * 圆面积公式:S=πr²
     */
    double circular(double r);
​
}
public class Client {
​
    public static void main(String[] args) {
        CalculationAreaExt calculationAreaExt = new CalculationAreaExt();
        double res = calculationAreaExt.circular(10);
        System.out.println(res);
    }
}

里氏代换原则

定义

开闭原则是从抽象化导出具体化。从抽象化到具体化的过程则需使用继承关系以及里氏代换原则

里式替换是实现开闭原则的途径之一,比开闭原则限制更强,像包含的关系

任何基类可以出现的地方,子类一定可以出现。

通俗理解:子类可以扩展父类的功能,但不能改变父类原有的功能。换句话说,子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。

分析

image-20231205211113414

依赖倒转原则

定义

细节应该依赖于抽象、抽象不应该依赖于细节

理解:

高层模块不依赖低层次模块的细节,不依赖具体实现,而是依赖于接口

要针对接口编程,不要针对实现编程

分析

 

接口隔离原则

定义

客户端不应该依赖于那些它不需要的接口

用多个专门的接口,而不使用单一的总接口

举个例子,如果一个接口包含了多个方法,而某个实现类只需要其中的一部分方法,那么其他不需要的方法就成了冗余。如果其他类要实现这个接口,它们也会被迫实现这些不需要的方法,从而导致代码冗余和不必要的复杂性。

分析

 

 

合成复用原则

定义

优先使用对象组合,而不是继承来达到复用的目的

分析

复用时要尽量使用组合/聚合关系(关联关系),少用继承

 

 

 

迪米特法则(最少知识原则)

定义

最少知道、减少依赖

一个模块或对象应尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立,这样当一个模块修改时,影响的模块就会越少,扩展起来更加容易。

只和你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to strangers)。

其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

分析

应用迪米特法则可降低系统的耦合度

 

标签:之七大,Java,原则,double,void,println,return,设计模式,public
From: https://www.cnblogs.com/ysk0904/p/17911097.html

相关文章

  • Java工具库中字符串判空方法知多少?各有什么区别?
    SpringFramework库在SpringBoot项目中,通常情况下,你不需要额外引入依赖来使用SpringFramework库中的常用工具方法,这是因为SpringBoot的起步依赖已经包含了SpringFramework的核心库,其中包括org.springframework.util包。这个用起来就很方便。在这里面有两个常用的方法:StringUtil......
  • 设计模式
    一.参考网址1. 设计模式2. 23种设计模式实战!超级全,超级好懂!......
  • 无涯教程-Java - Enumeration 枚举接口函数
    Enumeration接口定义了可以枚举对象集合中的元素的方法。下表总结了Enumeration声明的方法-Sr.No.Method&Remark1booleanhasMoreElements()当实现时,必须在提取更多元素时返回true,而在列举所有元素时返回false。2ObjectnextElement()这将返回枚举中的下一个对象......
  • Java | 多线程并发编程CountDownLatch实践
    关注:CodingTechWork引言  在一次数据割接需求中,数据需要通过编程的方式进行转移割接到新平台,此时若串行化方式,无疑会拉锯此次战斗,所以首当其冲要使用并发编程来降低割接时长。  本次主要考虑使用CountDownLatch工具类进行并发编程的控制。CountDownLatch概述  在并发编程过程......
  • 无涯教程-Java's Built-in Exceptions函数
    Java在标准包java.lang中定义了几个异常类。这些异常中最通用的是标准类型RuntimeException的子类。由于java.lang被隐式导入所有Java程序中,因此从RuntimeException派生的大多数异常都是自动可用的。Java定义了与其他各种类库相关的几种其他类型的异常。以下是JavaUnchecke......
  • Dart设计模式之桥接模式
    dart设计模式之桥接模式桥接模式(Bridge)模式分析桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这......
  • idea java import 规范化
    参考官方配置文件功能介绍一些标准会针对import的顺序、import*的使用有一定的要求,为了避免手动调整的窘境,可以通过idea基础配置,来实现import的自动格式化、规范化。配置路径:Settings-->Editor-->CodeStyle-->Java-->Imports选项内容解析:Layoutstaticimportsseparat......
  • Java互联网+公立医院绩效考核源码
    一、建设信息化医院绩效考核的意义1.提高考核效率:通过信息化手段,可以将绩效考核数据自动采集、整理、分析和报告,大大提高了考核效率,减少了人工干预和错误率。2.增强考核公正性:信息化考核可以减少人为因素的干扰,使考核更加公正、客观。同时,通过数据共享,可以增强考核结果的透明度和......
  • 暹罗外卖开源啦,一款java多商户外卖系统-商家入驻如美团饿了么
    暹罗外卖v1.0基于Vue/ElementUI和SpringCloud&Alibaba前后端分离的分布式微服务架构前言微信公众号【暹罗siam】,未来将会在公众号上持续性的输出很多原创小知识以及学习资源,欢迎各位小伙伴关注我,和我一起共同学习,同时我也希望各位小伙伴能够给暹罗外......
  • 无涯教程-Java - ByteArrayOutputStream函数
    ByteArrayOutputStream类流在内存中创建一个缓冲区,所有发送到该流的数据都存储在该缓冲区中。以下是ByteArrayOutputStream类将提供的构造函数的列表。Sr.No.Constructor&Remark1ByteArrayOutputStream()此构造函数创建一个具有32字节缓冲区的ByteArrayOutputStream。......