设计模式之设计模式七大原则(详解)单一职责原则、开闭原则、接口隔离原则、依赖倒置原则、迪米特法则、里氏替换原则、组合优于继承原则

【设计模式】通俗讲解设计模式的七大原则 设计模式的七大原则是编写高质量、可维护、可扩展代码的基石 阅读详情

设计模式

七大设计原则

什么是设计模式?

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

23中设计模式背后是7大设计原则,也就是说,每个设计模式都属于一个或多个设计原则

7大原则的背后是一个字 分

七大设计原则:

开闭原则、单一职责原则、里氏替换原则、依赖倒置原则、迪米特法则(最少知道原则)、接口隔离原则、组合优于继承原则

单一职责原则

对象不应承担太多功能,正如一心不能而用,比如太多的工作(种类)会使人崩溃。唯有专注才能保证对象的高内聚;唯有唯一,才能保证对象的细粒度。

每个类、方法、框架只专一做一件事情

例如 统计文本文件有多少个句子

 public static void main(String[] args) throws Exception {
        //统计一个文本文件中,有多少字符
        //reaer默认查询的码表是与操作系统一致的 码表,我们操作系统默认中文,即为gbk编码
        //而gbk码表一个汉字占两个字符,而且汉字的开头都是1开头的
     //---------------------负责加载文件并转换成字符串-------------
        FileReader reader = new FileReader("C:\\Users\\Lenovo\\Desktop\\gzmm.txt");
        BufferedReader br = new BufferedReader(reader);

        String line = null;
        StringBuilder sb =new StringBuilder("");
        while ((line =br.readLine())!=null ){
            sb.append(line);
            sb.append("");
        }
        //---------------------------字符串的切割,统计------------------
        String[] words = sb.toString().split("[.?!。]+");
        for (String string:words){
            System.out.println(string+"@");
        }
        System.out.println(words.length);
        br.close();
    }

上面的写法就违反了单一职责,同一个main方法中,我们即让它去加载文件,也让它去做分割,这样做的坏处是,每当我们需要调用其中的一个功能时(如我有文件只需要分割),仍需要重写一遍。

//----------------只负责文件的读取转换成string字符串
    public static String load(String path) throws IOException {
        FileReader reader = new FileReader(path);
        BufferedReader br = new BufferedReader(reader);

        String line = null;
        StringBuilder sb = new StringBuilder("");
        while ((line = br.readLine()) != null) {
            sb.append(line);
            sb.append("");
        }
        br.close();
        return sb.toString();
    }
    
    //----------------只负责字符串的切割、解析
    public static int parse(String sb ,String regex){
        String[] words = sb.toString().split(regex);
        for (String string:words){
            System.out.println(string+"@");
        }
        return words.length;
    }
    public static void main(String[] args) throws IOException {
        String str = loadFile("F:\\1.txt");
        String regex ="[^a-zA-Z]+";
        System.out.println(Textlength(str,regex));

    }

优点 通过单一职责,可以提高代码的重用性,通过单一职责的方法得到的数据我们不再有耦合,拿来可以做的事也不再局限。 提高系统的可维护性

代码的可读性提高了、变更风险更低、

降低类、方法、模块的复杂度

开闭原则

软件对象(类、模块、方法等)应该对于扩展是开放的,对修改是关闭的。比如:一个网络模块,原来只有服务端功能,而现在要加入客户端功能,那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将客户端和服务端分开。公共部分抽象出来。

对扩展新功能是开放的、对修改原来的功能是关闭的(加新功能不能影响原来代码)

创建一个汽车类:

`public class Car {
    private String brand;
    private String color;
    private boolean louyou;
    private double price;

    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", color='" + color + '\'' +
                ", louyou=" + louyou +
                ", price=" + price +
                '}';
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public boolean isLouyou() {
        return louyou;
    }

    public void setLouyou(boolean louyou) {
        this.louyou = louyou;
    }

    public double getPrice() {
        //在这里修改来原来的代码违反了开闭原则
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

当变化来临时,例如汽车的价格现在需要打折(打8折),这时,我们在Car的源代码中修改,就违反了开闭原则

违反开闭原则的实例:

    public double getPrice() {
        //在这里修改来原来的代码违反了开闭原则
        return price*0.8;
    }

正确的方式:

public class DiscountCar extends Car{
    @Override
    public double getPrice() {
        //在这里修改子类的方法并不会影响父类的代码
        return super.getPrice() * 0.8;
    }
}

开闭原则应该遵循应用场景去考虑,如果源代码就是你自己写的,而且需求是稳定的,那么,直接修改源代码也是一个简单的做法,但当源代码是别人的代码或架构是,我们就要去符合开闭原则,防止破坏结构的完整性!

为什么要使用开闭原则?

1、只要是面向对象的编程,在开发过程中都会强调开闭原则

2、是最基础的设计原则,其他五个设计原则都是开闭原则的具体形态

3、可以提高代码的复用性

4、可以提高代码的可维护性

如何使用开闭原则?

1、抽象约束

抽象对一组事物的通用描述,没有具体的实现,也就表示它可以有非常多的可能性,可以跟随需求的变化而变化。因此,通过接口或抽象类可以约束一组可能变化的行为,并且能够实现对扩展开放。

2、元数据控件模块行为

3、制定项目章程

4、封装变化

将相同的变化封装到一个接口或抽象类中,将不同的变化封装到不同的接口或抽象类中,不应该有两个不同变化出现在同一个接口或抽象类中。

接口隔离原则

接口隔离原则(Interface Segregation Principle):

1、客户端不应依赖它不需要的接口

2、类间的依赖关系应该建立在最小的接口上

其实通俗来理解就是,不要在一个接口里面放很多的方法,这样会显得这个类很臃肿。接口应该尽量细化,一个接口对应一个功能模块,同时接口里面的方法应该尽可能的少,使接口更加灵活轻便。或许有的人认为接口隔离原则和单一职责原则很像,但两个原则还是存在着明显的区别。单一职责原则是在业务逻辑上的划分,注重的是职责。接口隔离原则是基于接口设计考虑。例如一个接口的职责包含10个方法,这10个方法都放在同一接口中,并且提供给多个模块调用,但不同模块需要依赖的方法是不一样的,这时模块为了实现自己的功能就不得不实现一些对其没有意义的方法,这样的设计是不符合接口隔离原则的。接口隔离原则要求"尽量使用多个专门的接口"专门提供给不同的模块。

反例:

public interface Animal {
    void eat();
    void swim();
    void fly();
}
public class Dog implements Animal{
    @Override
    public void eat() {
        System.out.println("狗喜欢吃骨头");
    }

    @Override
    public void swim() {
        System.out.println("狗会狗刨");
    }

    @Override
    public void fly() {
    throw  new RuntimeException("The dog cannt fly ,you can you up , no can no bb!");
    }
}
public class Bird  implements Animal{
    @Override
    public void eat() {
        System.out.println("鸟吃虫子");
    }

    @Override
    public void swim() {
throw  new RuntimeException("鸟不会游泳");
    }

    @Override
    public void fly() {
        System.out.println("鸟会飞");
    }
}

这种总的接口写了很多方法,但是其他类去实现的时候会实现很多没有意义的方法,正确的方式应该是,分成很多小接口,不同接口分胆不同的功能,让类自己去选择实现自己需要的方法:

在这里插入图片描述

public class Bird implements EnableEat,EnableFly{
    @Override
    public void eat() {
	System.out.pritnln("狗吃骨头")
    }

    @Override
    public void fly() {
	//....
    }
}
public class Dog implements EnableEat,EnableFly{
    @Override
    public void eat() {
			//...
    }

    @Override
    public void fly() {
		//...
    }
}

依赖倒置原则

上层不能依赖于下层,他们都应该依赖抽象

什么是上层? 调用别人的方法的那一层

什么是下层? 方法被调用,提供方法的那一层

类与类之间的关系有几种?

依赖、继承、关联、组合、聚合

经典Uml类图:

在这里插入图片描述

讲解类图博客链接

违反依赖倒置的反例:人喂动物

public class AppTest {
    //此时来了一个需求想要喂养猫、鹦鹉、金鱼等等
    public static void main(String[] args) {
        Person person = new Person();
        Dog dog = new Dog();
        person.feed(dog);
      Cat cat=  new Cat();
        person.feed(cat);

    }
}
class Person{
    public void feed(Dog dog){
        System.out.println("人一撒狗粮");
        dog.eat();
    }
//此时及违反了开闭原则(修改了源代码)又违反了依赖倒置原则
    public void feed(Cat cat) {
        cat.eat();
    }
}
class Dog{
    public void eat(){
        System.out.println("狗吃骨头");
    }

}
class  Cat{
    public void eat(){
        System.out.println("猫吃鱼天经地义");
    }
}

在上面的代码中,人要喂狗,依赖于有一条狗,人作为上层依赖于下层,这样有什么坏处呢?

坏处是,当变化来临时,比如,人又养了一只猫,那么上层人这个类当中,就必须在添加喂猫的方法,每当下层变动时,上层也会跟着变动,而我们希望下层变动时,上层不会跟着改变

正例:他们都应该依赖于抽象

public class AppTest {
    public static void main(String[] args) {
        Person person = new Person();
        Dog dog = new Dog();
        person.feed(dog);
        Cat cat=  new Cat();
        person.feed(cat);

    }
}
interface Animal{
    void eat();
}
class Person{
    public void feed(Animal animal){
        System.out.println("人一撒粮");
        animal.eat();
    }
}
class Dog implements Animal{
    public void eat(){
        System.out.println("狗吃骨头");
    }

}
class  Cat implements Animal{
    public void eat(){
        System.out.println("猫吃鱼天经地义");
    }
}

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

迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。英文简写为: LoD 只和朋友通信

什么是朋友?

1.类中的字段

2.方法的返回值

3.方法的参数

4.方法中的实例对象

5.对象本身

6.集合中的泛型

最少知道原则

反例:关电脑的操作

public class AppTest {
    public static void main(String[] args) {
        Person person = new Person();
        person.closeTheComputer();
    }
}
class  Computer{
    public void saveData(){
        System.out.println("保存数据");
    }

    public void killProgress(){
        System.out.println("关掉程序");
    }
    public void closeScreen(){
        System.out.println("关掉屏幕");
    }
    public void powerOff(){
        System.out.println("关掉计算机的电源");
    }
}
class Person{
    private Computer c =new Computer();
//person对于computer知道的细节太多了
    //这样代码的复杂度就太高了
    public void closeTheComputer(){
        c.saveData();
        c.killProgress();
        c.closeScreen();
        c.powerOff();
    }
}

当用户关闭电脑时,需要调用计算机的各个方法,但是这些方法的细节太多了,会出现用户流程出错,遗漏调用等等,对于用户来言,他只需要知道关机按钮就够了

正例:封装细节,提供接口

class Computer {
    private void saveData() {
        System.out.println("保存数据");
    }
    private void killProgress() {
        System.out.println("关掉程序");
    }
    private void closeScreen() {
        System.out.println("关掉屏幕");
    }

    private void powerOff() {
        System.out.println("关掉计算机的电源");
    }
    public void closeComputer() {
        saveData();
        killProgress();
        closeScreen();
        powerOff();
    }
}

class Person {
    private Computer c = new Computer();

    //person对于computer知道的细节太多了
    //这样代码的复杂度就太高了
    public void closeTheComputer() {
        c.closeComputer();
    }
}

里氏替换原则

里氏替换原则: 任何能用父类对象的地方,都能透明的使用子类替换

简介

里氏替换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。

ps:子类替换父类时,不能比父类的访问修饰更严格,不能抛出父类不存在的异常

使用时,需要考虑:

1.是否有“is-a”的关系

2.有is-a关系后,要考虑子类替换父类后会不会出现逻辑变化

反例:正方形非长方形

public class AppTest {
    public static void main(String[] args) {
        Rectangle rectangle = new Square();
        rectangle.setWidth(12);
        rectangle.setLength(20);
        System.out.println(rectangle);
        Util.transform(rectangle);
    }
}
class Rectangle{
    private double length;
    private double width;

    @Override
    public String toString() {
        return "Rectangle{" +
                "length=" + length +
                ", width=" + width +
                '}';
    }

    public Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    public Rectangle() {
    }

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }
}
class Util{
    public static void transform(Rectangle rectangle){
        while (rectangle.getWidth()<=rectangle.getLength()){
            rectangle.setWidth(rectangle.getWidth()+1);
            System.out.println("{"+rectangle.getLength()+":"+rectangle.getWidth()+"}");
        }
    }
}
class Square extends Rectangle{
    private double sideLength;

    @Override
    public double getLength() {
        return sideLength;
    }

    @Override
    public void setLength(double length) {
        this.sideLength=length;
    }

    @Override
    public double getWidth() {
        return sideLength;
    }

    @Override
    public void setWidth(double width) {
        this.sideLength =width;
    }
}

继承优点:

● 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;
● 提高代码的重用性;
● 子类可以形似父类,但又异于父类,“龙生龙,凤生凤,老鼠生来会打洞”是说子拥有父的“种”,“世界上没有两片完全相同的叶子”是指明子与父的不同;
● 提高代码的可扩展性,实现父类的方法就可以“为所欲为”了,君不见很多开源框架的扩展接口都是通过继承父类来完成的;
● 提高产品或项目的开放性。

继承缺点:

● 继承是侵入性的。只要继承,就必须拥有父类的所有属性和方法;
● 降低代码的灵活性。子类必须拥有父类的属性和方法,让子类自由的世界中多了些约束;
● 增强了耦合性。当父类的常量、变量和方法被修改时,需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能带来非常糟糕的结果——大段的代码需要重构。

在类中调用其他类时务必要使用父类或接口,如果不能使用父类或接口,则说明类的设计已经违背了LSP原则。

如果子类不能完整地实现父类的方法,或者父类的某些方法在子类中已经发生“畸变”,则建议断开父子继承关系,采用依赖、聚集、组合等关系代替继承。

WSDL 是基于 XML 的用于描述 Web Services 以及如何访问 Web Services 的语言。

里氏替换原则为良好的继承定义了一个规范,一句简单的定义包含了4层含义。
1.子类必须完全实现父类的方法
2.子类可以有自己的个性
3.覆盖或实现父类的方法时输入参数可以被放大

4.覆写或实现父类的方法时输出结果可以被缩小

组合优于继承

组合优于继承:复用别人代码时,应该使用组合

反例:继承hashset,重写父类add方法,每次add元素时count+1;

public class AppTest {
    public static void main(String[] args) {
        MySet mySet = new MySet();
        HashSet<String> set = new HashSet<>();
        set.add("a");
        set.add("c");
        set.add("f");
        set.add("h");

        mySet.addAll(set);
        System.out.println(mySet.getCount());
    }

}
class MySet extends HashSet
{
    private  int count= 0;
    public boolean add(Object e){
        count ++;
        return super.add(e);
    }
    public int getCount(){
        return count;
    }

    @Override
    public boolean addAll(Collection c) {
        count+=c.size();
        return super.addAll(c);

        //父类 的addall中回调了add方法
//        public boolean addAll(Collection<? extends E> c) {
//            boolean modified = false;
//            for (E e : c)
//                if (add(e))
//                    modified = true;
//            return modified;
    }
}

假如我们继续重写addAll方法添加相应的判断时,又会出现新的问题,我们的count并没有正确的累计,因为在HashSet的源码addAll方法中,回调了add方法,并没有解决需求

那我们不重写addAll,反正它会回调add,完成计数,就没有问题了吗?

其实并不能解决问题,hashset的源码我们不能保证永远不会更改,假如在下一个版本中,hashset的作者更改了addAll方法,那么我们的功能也会不能正常实现了!

当继承的父类作者不是我们自己的时候,我们没有办法保证父类代码不会变更,假如我们继承了这个父类,那么我们最好是只去复用父类的代码,避免去重写或新建方法,防止源码结构变更带来的打击

也就是说,在我们需要重用代码,并且重用的代码作者并不是我们自己的时候,我们要采用组合的方式。

正例:组合优于继承

public class AppTest {
    public static void main(String[] args) {
        MySet mySet = new MySet();
        HashSet<String> set = new HashSet<>();
        set.add("a");
        set.add("c");
        set.add("f");
        set.add("h");

        mySet.addAll(set);
        System.out.println(mySet.getCount());
    }
}

class MySet {
    private int count = 0;
    Set set = new HashSet();

    public boolean add(Object e) {
        count++;
        return set.add(e);
    }

    public int getCount() {
        return count;
    }

    public boolean addAll(Collection c) {
        count += c.size();
        return set.addAll(c);
    }
}

这样来写,我们类中的add和addAll方法跟HashSet中的add和addAll方法的不在有关系,也能解决这个问题

软件架构设计原则-开闭、依赖倒置、单一职责、接口隔离、迪米特、里氏替换、合成复用,附Java语言示例讲解 是指一个软件实体(如类、模块和函数)应该对外扩展开放,对修改关闭。所谓的关闭,也正是对扩展和修改两个行为的一个原则。它强调的是用抽象构建框架,用实现扩展细节,可以提高软件系统的可复用性和可维护性。开闭原则是面向对象设计的最基本原则,例如版本更新,可以实现尽量不修改源代码的前提下增加新功能。 阅读详情

相关推荐

七大软件架构设计原则详解

详细讲解软件设计领域的七大软件架构设计原则!

dvlinker的技术专栏 1万+

单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特、合成复用

一、单一职责原则 1、目的 降低代码复杂度、降低系统耦合度、提高可读性 2、定义 对于一个类,只有一个引起该类变化的原因;该类的职责是唯一的,且这个职责是唯一引起其他类变化的原因。 3、解决 将不同的职责封装到不同的类或者模块中,当有新的需求将现有的职责分为颗粒度更小的职责的时候,应该及时对现有代码进行重构。 4、注意事项和细节 (1)降低类的复杂度,一个类只负责一项职责; (2)提高类的可读性,可维护性; (3)降低变更引起的风险; (4)通常情况下,我们应当遵守单一职责原则,只有逻

学Java,找哪吒 8270

Java设计模式之间的关系图

用图的方式解释Java设计模式之间的关系

单一职责原则、开放封闭原则、依赖倒转原则、里氏代换原则、迪米特法则、合成/聚合复用原则

1.单一职责原则(SRP): 就一个类而言,应该仅有一个引起它变化的原因。 如果一个类承担的职责太多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。 比如业务操作和日志记录类进行分开,界面和逻辑分开等等。职责分离,单一职责,更有利于维护和拓展。 2.开放-封闭原则: 类,模块,函数等等,应该可以拓展,但是不可以修改。 也就是:对于拓展是开放的,对于更改是封闭...

hello world 898

告别实车测试:手把手教你用Vector VT平台搭建OBC/DCDC的HIL测试台架

本文详细介绍了如何利用Vector VT平台搭建新能源汽车OBC/DCDC的HIL测试台架,涵盖硬件选型、模型部署到自动化测试的全流程。通过HIL仿真测试技术,工程师可以高效验证动力域关键部件,大幅缩短开发周期并降低成本,特别适合新能源汽车三电系统的开发验证。

weixin_42659194的博客 340

RK3399跨楼层机器人:SLAM技术与商业应用解析

SLAM(即时定位与地图构建)技术是移动机器人自主导航的核心,通过激光雷达、视觉传感器等多源数据融合实现厘米级定位。RK3399作为高性能嵌入式平台,其六核架构和Mali GPU能高效处理SLAM算法与传感器数据。在商业场景中,这种技术组合可支撑机器人实现跨楼层物资配送、仓库盘点等复杂任务。以SLAMTEC Hermes平台为例,其模块化设计支持电梯控制集成,配合双深度相机和360°激光雷达,在医疗、物流等领域已实现12分钟平均配送效率和99.7%的识别准确率。

weixin_30376083的博客 620

【设计模式】单一职责原则、开放-封闭原则、依赖倒转原则、里氏代换原则

单一职责原则是指就一个类而言,应该仅有一个引起它变化的原因。 软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。如果你能够想到多余一个的动机去改变一个类,那么这个类就具有多于一个的职责,就应该考虑职责的分离。   开放-封闭原则,是说软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。 这个原则有两个特征:对于扩展是开放的;对于更改是封闭的。 面对需求,对程序的改动是通...

qq_26916435的博客 353

Windows——Nessus安装(无限制)

Nessus手把手图文安装,解除ip限制~

网安小白的博客 9450

Java设计模式之设计的6大原则(开闭原则,里氏代换原则,依赖倒转原则,接口隔离原则,最少知道原则,合成复用原则)

1. 开闭原则 核心思想:一个对象对外扩展开发,对修改关闭 意思就是:对类的改动是通过增加代码进行的,而不是修改现有的代码。 也就是说软件开发人员一旦写出了可以运行的代码,就不应该去改动它,而是要保证它能一直运行下去,这就需要借助抽象和多态,即 把可能变化的内容抽象出来,从而使抽象的部分是相对稳定的,而具体的实现则是可以改变和扩展的。 示例:搜狗输入法换肤 代码实现: public abstract class AbstractSkin { // 声明抽象方法 public abstract

qq_46656580的博客 1588

L2CAP 面向连接信道(CoC)在 BLE 中的应用:建立、流控与数据传输

L2CAP(逻辑链路控制与适配协议)是蓝牙协议栈中的核心层,位于基带层之上,为上层协议提供数据传输服务。在低功耗蓝牙(BLE)中,L2CAP面向连接信道(Connection-Oriented Channel, CoC) 是实现可靠数据传输的关键机制,广泛应用于健康监测、智能家居、工业控制等领域。

byte轻骑兵的技术小窝 3637

088、多摄像头跨镜目标追踪 ID 频繁切换?ReID 特征 + 轨迹关联 + 时间约束方案

文章摘要:本文针对多摄像头跨镜目标追踪中ID频繁切换的问题,提出了一种结合ReID特征、轨迹关联和时间约束的综合解决方案。作者分析了ID切换的三个主要原因:ReID特征不稳定、轨迹关联依赖最近邻匹配以及忽略时间约束。通过改进ReID特征提取(多层特征融合)、引入轨迹预测(卡尔曼滤波)和添加时间窗口约束,成功将ID切换率从35%降至3%以下。文章详细分享了实现细节和踩坑经验,为跨摄像头目标追踪提供了实用优化思路。

ai技术增长的博客 169

对于设计模式中七大原则的理解

使用设计模式能够使我们开发的程序,易维护、可拓展,可复用。但是在23个设计模式的背后,还有7个开发原则去支撑着设计模式,保证23个设计模式能够易维护、可拓展,可复用。所以这篇文章来解开七大设计原则的神秘面纱。

小小张自由—>张有博 4095

基于Matlab模拟RANS湍流——详细分析与源代码

在模拟过程中,我们首先定义了模拟所需的参数,包括流体的动力黏度和密度,以及边界条件和网格分辨率。接下来,通过求解平均值方程和湍流涨落方程,我们模拟了湍流的演化过程。在本文中,我们将使用Matlab对RANS湍流进行模拟,并提供相应的源代码。RANS湍流模拟的基本思想是将流场的变量分解为平均值和涨落值,并通过求解平均值方程和湍流涨落方程来描述流场的演化。请注意,以上代码仅为示例,实际的RANS湍流模拟可能需要更复杂的算法和模型。接下来,我们将求解RANS方程,包括平均值方程和湍流涨落方程。

ByteKnight的博客 862

【Java设计模式】软件设计七大原则

文章目录软件设计原则的分类开闭原则依赖倒置原则单一职责原则接口隔离原则迪米特法则(最少知道原则)里氏替换原则合成/复用原则(组合/复用原则) 软件设计原则的分类 开闭原则 依赖倒置原则 单一职责原则 接口隔离原则 迪米特法则(最少知道原则) 里氏替换原则 合成/复用原则(组合/复用原则) 在设计模式中会有这7中软件设计原则的体现,但是值得注意的是这7钟设计原则在设计模式中的使用是有取舍的,有...

明月沉江春雾晓 2万+

新能源汽车电机交流电流测量系统精度全链路分析

通过全链路误差建模与瓶颈分析,结合硬件选型优化与软件算法补偿,可将系统精度从4.2%提升至≤1% FS。本文所述方法论已应用于某800V电驱平台开发,实测电流控制精度达±0.8%,为高性能电机控制奠定基础。为例,深入剖析从互感器采集到CAN报文解析的全链路信号处理流程,揭示各环节误差来源及对最终精度的影响,为研发测试提供理论支撑。:±0.1%(电阻温漂与运放开环增益限制):运放增益带宽积(GBW)不足导致高频衰减。:±0.02%/℃(铁氧体材料温敏特性):±0.5%读数(磁芯饱和效应)

优快云-新能源汽车研发测试专业博主 1493

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

设计模式——七大设计原则

设计模式的七大原则:开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、合成复用原则、迪米特法则

weixin_43412762的博客 4371

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

软件设计七大原则

开闭原则,依赖倒置原则,单一职责原则,接口隔离原则,最少知道原则,里氏替换原则,合成复用原则

2157

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

设计模式之七大设计原则

浅析面向对象七大设计原则

嘉禾嘉宁papa 1762

设计模式七大原则

1、设计模式的目的 ​ 编写软件过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的挑战,设计模式是为了让程序(软件),具有更好 ​ 1) 代码重用性 (即:相同功能的代码,不用多次编写) ​ 2) 可读性 (即:编程规范性, 便于其他程序员的阅读和理解) ​ 3) 可扩展性 (即:当需要增加新的功能时,非常的方便,称为可维护) ​ 4) 可靠性 (即:当我们增加新的功能后,对原来的功能没有影响) ​ 5) 使程序呈现高内聚,低耦合的特性 2、设计模式七大原则 ​ 设计模

java123456111的博客 4834

面向对象设计的七大设计原则详解

面向对象的七大设计原则 文章目录面向对象的七大设计原则简述七大原则之间的关系一、开闭原则(The Open-Closed Principle ,OCP)概念理解系统设计需要遵循开闭原则的原因开闭原则的实现方法一个符合开闭原则的设计开闭原则的相对性二、 里氏替换原则(Liskov Substitution Principle ,LSP)概念理解里式替换原则的优点重构违反LSP的设计三、 迪米特原则...

夕虞的博客 7万+

设计模式的七大原则

设计模式的七大原则 开闭原则 单一职责原则 里氏替换原则 迪米特法则 依赖倒置原则 接口隔离原则 合成/聚合原则 1. 开闭原则(Open-Closed Principle, OCP) 定义 软件实体应当对扩展开放,对修改关闭。这句话说得有点专业,更通俗一点讲,也就是:软件系统中包含的各种组件,例如模块(Modules)、类(Classes)以及功能(Functions)等等,应该在不修改现有...

kaven 4822

面向对象设计的七大原则 (包括SOLID原则)

面向对象的设计的7大原则

m0_45406092的博客 4656

设计模式 六大原则

定义一个方法、一个类只负责一个职责,各个职责的程序改动。不影响其他程序。目的降低类和类的耦合,提高可读性,增加可维护性和可扩展性,降低可变性的风险。

独立游戏开发 1396

掌握设计模式七大原则,提升代码质量

设计模式是软件开发中解决常见问题的最佳实践,而设计原则则是指导这些模式的基本准则。本文介绍了七大设计原则,包括单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖倒置原则(DIP)、合成复用原则和迪米特法则,并通过C#代码示例详细解释了这些原则的实际应用。 单一职责原则(SRP):一个类应只负责一项职责,以提高代码的内聚性和可维护性。示例中,将员工管理、薪水计算、数据持久化和报表生成等功能分离到不同的类中,避免了单一类承担过多职责。 开闭原则(OCP):软件实体应

冰茶的博客 1494

『设计模式』开发设计的七大原则,我做人还是挺有原则,那些代码呢?

设计模式的七大原则: 单一职责原则SRP(Single Responsibility Principle) 就一个类而言,应该仅有一个引起它变化的原因。 开放-关闭原则OCP(Open-CLosed Principle) 一个软件的实体应该对扩展开放,对修改关闭。 里氏代换原则(Liskov Substitution Principle) 子类型必须能够替换他们的基类(父类)。 依赖倒置原则DIP(Dependence Inversion Principle) 要依赖于抽象,不要依赖于具体。 最少知识原则

日拱一卒,功不唐捐 3124
上一篇: 找出两个文件中相同的单词(java实现)
下一篇: spring(三)AOP、spring声明式事务、Webflux的执行流程和核心API
·小脑斧·
博客等级 码龄7年 10粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值