设计模式的七大原则及其分类

Java设计模式简介、设计模式原则及分类 Java设计模式简介、设计模式原则及设计模式分类 阅读详情

什么是设计模式?

设计模式(Design Pattern) ,这个术语最初并不是出现在软件设计中,而是被用于建筑领域的设计中,后来随着软件工程的发展,设计模式思想被引入到软件工程中。直到今天,狭义的设计模式还是人们广为流传的 23 种经典设计模式。

设计模式(Design pattern)代表了计算机软件工程最佳的实践,是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。

在当今大型工程软件体系的发展背景下,不管是设计模式也好,其他工程模式也罢,都是为了解决问题而发明的有效方法。除了常见的的23种设计模式以外,还有 MVVM、MVC、Combinator 等,都是前辈们经过多年的摸爬滚打总结出来的,其有效性不容置疑。对于传统简单的程序开发,写一个简单的算法可能比引入某种设计模式更容易实现,但对于大型项目开发或框架设计,用设计模式来组织代码才是主要方向。


合理使用设计模式

曾有人这样说:

设计模式是为了封装变化,让各个模块可以独立变化。精准地使用设计模式的前提是你能够精准的预测需求变更的走向。
 
我们都知道大部分人是做不到的,所以大部分人就算精通设计模式也多少会做错点什么东西。所以这其实不怪设计模式。所以说如何避免过度设计,这就要求你深入的理解你的程序所在的领域的知识,了解用户使用你的软件是为了解决什么问题,这样你预测用户的需求才会比以前更加准确,从而避免了你使用设计模式来封装一些根本不会发生的变化,也避免了你忽视了未来会发生的变化从而发现你使用的模式根本不能适应需求的新走向。
 
所以,在你满足了【知道所有设计模式为什么要被发明出来】的前提之后,剩下的其实都跟编程没关系,而跟你的领域知识和领域经验有关系。

我认为说的很对,合理使用设计模式应该基于对工程的完全理解。

 

设计模式的七大原则

俗话说得好,没有规矩不成方圆,设计模式也要遵循一些准则。一般地,我们在设计软件工程的时候需要遵循七项基本原则,分别是:

  • 单一职责原则(Single Responsibility)
  • 接口隔离原则(Interface Segregation)
  • 依赖倒置原则(Dependence Inversion)
  • 里氏替换原则(Liskov Substitution)
  • 开闭原则(Open Close)
  • 迪米特法则(Demeter)
  • 合成复用原则(Composite Reuse)

设计模式包含了面向对象的精髓,懂了设计模式就懂了面向对象分析(OOA)和设计(OOD)的精要。

 

1. 单一职责原则

对于类来说,一个类应该只负责一项职责。

  1. 降低类的复杂度。
  2. 提高类的可读性,可维护性。
  3. 降低变更引起的风险。
  4. 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级别违反单一职责原则;只有类中的方法足够少,可以在方法级别违反单一职责原则。
2. 接口隔离原则

一个类不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。
在这里插入图片描述

3. 依赖倒置原则 (面向接口编程)
  1. 高层模块不应该依赖低层模块,二者都应该依赖其抽象。
  2. 抽象不应该依赖细节,细节应该依赖抽象。
  3. 依赖倒转(倒置)的中心思想是面向接口编程。
  4. 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在 Java 中,抽象指的是接口或抽象类,细节就是具体的实现类。
  5. 使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。
4. 里氏替换原则 (正确使用继承)

里氏替换原则,主张使用“抽象(Abstraction)”和“多态(Polymorphism)”将设计中的静态结构改为动态结构,维持设计的封闭性。“抽象”是语言提供的功能。“多态”由继承语义实现。
里氏替换原则的内容可以描述为: “派生类(子类)对象可以在程式中代替其基类(超类)对象。”

  1. 如果对每个类型为 T1 的对象 object1 ,都有类型为 T2 的对象 object2 ,使得以 T1 定义的所有程序 P 在所有的对象 object1 都代换成 object2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。换句话说,所有引用基类的地方必须能透明地使用其子类的对象。
  2. 在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法。
  3. 里氏替换原则告诉我们,继承实际上让两个类耦合性增强了,在适当的情况下,可以通过 聚合、组合、依赖 来解决问题。
5. 开闭原则 (编程中最基础、最重要的设计原则)
  1. 一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节。
  2. 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
  3. 编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。

违反开闭原则的示例代码
GraphicEditor 类违反了开闭原则。

// 主方法
public class Ocp {

    public static void main(String[] args) {
        //使用看看存在的问题
        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(new Rectangle());
        graphicEditor.drawShape(new Circle());
        graphicEditor.drawShape(new Triangle());
    }

}


//这是一个用于绘图的类 [使用方]
class GraphicEditor {
    //接收Shape对象,然后根据type,来绘制不同的图形
    public void drawShape(Shape s) {
        if (s.m_type == 1)
            drawRectangle(s);
        else if (s.m_type == 2)
            drawCircle(s);
        else if (s.m_type == 3)
            drawTriangle(s);
    }

    //绘制矩形
    public void drawRectangle(Shape r) {
        System.out.println(" 绘制矩形 ");
    }

    //绘制圆形
    public void drawCircle(Shape r) {
        System.out.println(" 绘制圆形 ");
    }
    
    //绘制三角形
    public void drawTriangle(Shape r) {
        System.out.println(" 绘制三角形 ");
    }
}


//Shape类,基类
class Shape {
    int m_type;
}


class Rectangle extends Shape {
    Rectangle() {
        super.m_type = 1;
    }
}


class Circle extends Shape {
    Circle() {
        super.m_type = 2;
    }
}


//新增画三角形
class Triangle extends Shape {
    Triangle() {
        super.m_type = 3;
    }
}

改进示例代码

// 主方法
public class Ocp {

    public static void main(String[] args) {
        //使用看看存在的问题
        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(new Rectangle());
        graphicEditor.drawShape(new Circle());
        graphicEditor.drawShape(new Triangle());
        graphicEditor.drawShape(new OtherGraphic());
    }

}


//这是一个用于绘图的类 [使用方]
class GraphicEditor {
    //接收Shape对象,调用draw方法
    public void drawShape(Shape s) {
        s.draw();
    }
}


//Shape类,基类
abstract class Shape {
    int m_type;
    
    public abstract void draw(); //抽象方法
}


class Rectangle extends Shape {
    Rectangle() {
        super.m_type = 1;
    }

    @Override
    public void draw() {
        // TODO Auto-generated method stub
        System.out.println(" 绘制矩形 ");
    }
}


class Circle extends Shape {
    Circle() {
        super.m_type = 2;
    }

    @Override
    public void draw() {
        // TODO Auto-generated method stub
        System.out.println(" 绘制圆形 ");
    }
}


//新增画三角形
class Triangle extends Shape {
    Triangle() {
        super.m_type = 3;
    }

    @Override
    public void draw() {
        // TODO Auto-generated method stub
        System.out.println(" 绘制三角形 ");
    }
}


//新增一个图形
class OtherGraphic extends Shape {
    OtherGraphic() {
        super.m_type = 4;
    }

    @Override
    public void draw() {
        // TODO Auto-generated method stub
        System.out.println(" 绘制其它图形 ");
    }
}

6. 迪米特法则 (降低类之间的耦合)
  1. 一个对象应该对其他对象保持最少的了解。
  2. 类与类关系越密切,耦合度越大。
  3. 迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的 public 方法,不对外泄露任何信息。
  4. 迪米特法则还有个更简单的定义:只与直接的朋友通信。

什么是直接的朋友?
每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系, 我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合 等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。

违反迪米特法则的示例代码

//主方法
public class Demeter1 {

    public static void main(String[] args) {
        //创建了一个 SchoolManager 对象
        SchoolManager schoolManager = new SchoolManager();
        //输出学院的员工id 和 学校总部的员工信息
        schoolManager.printAllEmployee(new CollegeManager());
    }

}


//学校总部员工类
class Employee {
    private String id;

    public void setId(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }
}


//学院的员工类
class CollegeEmployee {
    private String id;

    public void setId(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }
}


//管理学院员工的管理类
class CollegeManager {
    //返回学院的所有员工
    public List<CollegeEmployee> getAllEmployee() {
        List<CollegeEmployee> list = new ArrayList<>();
        //这里我们增加了10个员工到 list
        for (int i = 0; i < 10; i++) {
            CollegeEmployee emp = new CollegeEmployee();
            emp.setId("学院员工id= " + i);
            list.add(emp);
        }
        
        return list;
    }
}


//学校管理类

//分析 SchoolManager 类的直接朋友类有 Employee、CollegeManager
//CollegeEmployee 不是 直接朋友 而是一个陌生类,这样违背了 迪米特法则
class SchoolManager {
    //返回学校总部的员工
    public List<Employee> getAllEmployee() {
        List<Employee> list = new ArrayList<>();
        //这里我们增加了5个员工到 list
        for (int i = 0; i < 5; i++) {
            Employee emp = new Employee();
            emp.setId("学校总部员工id= " + i);
            list.add(emp);
        }
        
        return list;
    }

    //该方法完成输出学校总部和学院员工信息(id)
    void printAllEmployee(CollegeManager sub) {
        
        //分析问题
        //1. 这里的 CollegeEmployee 不是 SchoolManager的直接朋友
        //2. CollegeEmployee 是以局部变量方式出现在 SchoolManager
        //3. 违反了 迪米特法则
        
        //获取到学院员工
        List<CollegeEmployee> list1 = sub.getAllEmployee();
        System.out.println("------------学院员工------------");
        for (CollegeEmployee e : list1) {
            System.out.println(e.getId());
        }

        //获取到学校总部员工
        List<Employee> list2 = this.getAllEmployee();
        System.out.println("------------学校总部员工------------");
        for (Employee e : list2) {
            System.out.println(e.getId());
        }
    }
}

改进示例代码

// 主方法
public class Demeter1 {

    public static void main(String[] args) {
        System.out.println("~~~使用迪米特法则的改进~~~");
        //创建了一个 SchoolManager 对象
        SchoolManager schoolManager = new SchoolManager();
        //输出学院的员工id 和 学校总部的员工信息
        schoolManager.printAllEmployee(new CollegeManager());
    }

}


//学校总部员工类
class Employee {
    private String id;

    public void setId(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }
}


//学院的员工类
class CollegeEmployee {
    private String id;

    public void setId(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }
}


//管理学院员工的管理类
class CollegeManager {
    //返回学院的所有员工
    public List<CollegeEmployee> getAllEmployee() {
        List<CollegeEmployee> list = new ArrayList<>();
        //这里我们增加了10个员工到 list
        for (int i = 0; i < 10; i++) {
            CollegeEmployee emp = new CollegeEmployee();
            emp.setId("学院员工id= " + i);
            list.add(emp);
        }
        
        return list;
    }
    
    //输出学院员工的信息
    public void printEmployee() {
        //获取到学院员工
        List<CollegeEmployee> list1 = getAllEmployee();
        System.out.println("------------学院员工------------");
        for (CollegeEmployee e : list1) {
            System.out.println(e.getId());
        }
    }
}


//学校管理类


//分析 SchoolManager 类的直接朋友类有 Employee、CollegeManager
class SchoolManager {
    //返回学校总部的员工
    public List<Employee> getAllEmployee() {
        List<Employee> list = new ArrayList<>();
        //这里我们增加了5个员工到 list
        for (int i = 0; i < 5; i++) {
            Employee emp = new Employee();
            emp.setId("学校总部员工id= " + i);
            list.add(emp);
        }
        
        return list;
    }

    //该方法完成输出学校总部和学院员工信息(id)
    void printAllEmployee(CollegeManager sub) {
        
        //分析问题
        //1. 将输出学院的员工方法,封装到CollegeManager
        sub.printEmployee();
    
        //获取到学校总部员工
        List<Employee> list2 = this.getAllEmployee();
        System.out.println("------------学校总部员工------------");
        for (Employee e : list2) {
            System.out.println(e.getId());
        }
    }
}
7. 合成复用原则

原则是尽量使用组合/聚合的方式,而不是使用继承。

如果要使用继承关系,则必须严格遵循里氏替换原则。合成复用原则和里氏替换原则相辅相成,两者都是开闭原则的具体实现规范。

 

为什么不推荐优先使用继承?

  1. 继承复用破坏了类的封装性。因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为“白箱”复用。而组合和聚合复用维持了类的封装性。因为成分对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。
  2. 子类与父类的耦合度高。父类的实现的任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护。
  3. 继承限制了复用的灵活性。从父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化。而组合和聚合复用可以在运行时动态进行,新对象可以动态地引用与已有对象类型相同的对象,也就是说,在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新对象通过向这些对象的委派达到复用已有功能的目的。

 
 

设计模式的分类

设计模式有两种分类方法,即 模式的目的 和 模式的作用范围。

  • 根据模式是用来完成什么工作,这种方式可分为 创建型模式、结构型模式 和 行为型模式 3 种。

    • 创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。主要有单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。
    • 结构型模式:用于描述如何将类或对象按某种布局组成更大的结构。主要有代理、适配器、桥接、装饰、外观、享元、组合等 7 种结构型模式。
    • 行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。主要有模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等 11 种行为型模式。

     

  • 根据模式是主要用于类上还是主要用于对象上,这种方式可分为 类模式 和 对象模式 两种。

    • 类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了。工厂方法、(类)适配器、模板方法、解释器属于该模式。
    • 对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。除了以上 4 种,其他的都是对象模式。

     
    在这里插入图片描述

总结

这 7 种设计原则是软件设计模式必须尽量遵循的原则,各种原则要求的侧重点不同。

  1. 开闭原则,要对扩展开放,对修改关闭
  2. 依赖倒置原则,要面向接口编程
  3. 接口隔离原则,接口要精简设计
  4. 单一职责原则,实现类要职责单一
  5. 里氏替换原则,不要破坏继承体系
  6. 迪米特法则,要降低类之间的耦合度
  7. 合成复用原则,优先使用组合或者聚合关系复用,少用继承关系复用
ARFoundation系列讲解 - 24 锚点 一、添加平面检测和平面可视化 请参考 ARFounnation快速入门-08平面检测 案例 二、添加射线检测 1.在AR Session Origin 组件上添加ARRaycastManager 脚本 阅读详情

相关推荐

神经网络基础-从零开始搭建一个神经网络

人工神经网络(Articial Neural Network,简写为ANN)也称为神经网络(NN),是一种模仿生物神经网络和功能的计算模型,人脑可以看做是一个生物神经网络,由众多的神经元连接而成,各个神经元传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通过轴突输出信号。人工神经网络也是类似,通过模仿人脑的“学习机器”,通过不断“看”数据(比如图片,数字),自己总结规律,最终学会预测(比如分类图片)在深度学习中,损失函数是用来衡量模型参数的质量的函数,衡量的方式是比较网络输出和真实输出的差异。

Zach的博客 4014

设计模式(1)-设计模式的七大原则(一)

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

九岁ya的博客 406

Python+gensim【中文LDA】简洁模型

文章目录完整代码过程详解words_lsdictionarydictionary.doc2bow函数corpuslda 完整代码 from gensim import corpora, models import jieba.posseg as jp # 待分析文本集 text1 = '美国教练坦言,没输给中国女排,是输给了郎平' text2 = '中国女排世界排名第一?真实水平如何,听听巴西和美...

ArYe 2万+

设计模式的七大原则(1) --单一职责原则

前言 最近工作中备受打击,之前设计的很多程序都被老大否决,需要重构,让我好好看看设计模式。之前对这一块内容的确不怎么重视,感觉枯燥无聊又派不上用场。后来沉下心来研究了一番... 我靠,原来如此,之前写代码的时候怎么这么傻逼,很多问题其实在一开始设计的时候就能避免。之前写的都是些什么鬼。 我们踩过的坑,历代前辈们也踩过。可想而知,通他们多年的踩坑填坑经验后,所总结出来的23种设计模式是多么的宝贵,就是我们的“ONE PIECE” 啊。如果掌握了这个内容,对今后无论是工作中还是面试都非常重要。因此下定...

whyrookie的博客 214

利用 Docker Distribution 搭建私有的 Docker Registry

1、拓扑

weixin_44983653的博客 1067

Python使用netmiko配置华为交换机

1.netmiko就是专门为网络设备做的模块,非常强大。1.更适合网络设备的自动化运维模块。2、批量配置变更、备份。1.安装netmiko。2. 创建SSH连接。一、netmiko介绍。

博然的宝藏库 2795

设计模式的七大设计原则解读

设计模式一共有七大设计原则,其中包括开闭原则,单一职责原则,里氏替换原则,依赖导致原则,接口隔离原则,迪米特法则,合成复用原则。 一、开闭原则(Open Close Principle) 开闭原则是设计模式的总原则,开闭原则简单来说就是:对扩展开放,对修改关闭。 1. 如何理解“对扩展开放、对修改关闭”? 添加一个新的功能,应该是通过在已有代码基...

zhaojun20161206的博客 922

UG\NX二次开发 判断对象是虚线还是实线

网友提问“怎么区分虚线实线”,这个可以通过函数判断。

王牌飞行员_里海的博客 357

设计模式的七大原则与分类总览

设计模式的目的: 提高代码的重用性,即 相同功能的代码不用多次编写。 提高可读性,即 便于其他程序员的阅读和理解。 提高可拓展性,即 便于增加行的功能,可维护。 提高可靠性,即 增加新功能后,对原来的功能没有影响。 使程序呈现 高内聚,低耦合的特性。 设计原则的核心思想: 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混合在一起。 针对接口编程,而不是针对实现编程。 为了交互对象之间的松耦合设计而努力。 1. 单一职责 解释:一个类应该只负责一项职责。分为 [

weixin_43868322的博客 359

A2A 协议详解:Agent Card 的设计与实现

Agent Card 是 Agent2Agent (A2A) 协议中实现智能体发现与互操作性的核心组件。本文将深入剖析 Agent Card 的设计理念、关键字段及其在智能体生态系统中的作用。我们将通过详细的 JSON Schema 解析和 Python SDK 示例,帮助您理解如何精确地定义和发布智能体能力,为构建可发现、可协作的 AI 智能体奠定基础。当您使用a2a.Agent类初始化一个智能体时,SDK 会根据您提供的参数(nameversion等)自动构建内部的 Agent Card 表示。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1476

QLineEdit控件: 实现IP地址输入框(基于编辑信号)

在开发网络应用程序时,经常需要用户输入IP地址。直接使用普通输入框容易导致格式错误,用户体验也较差。本文将手把手教你用Qt的QLineEdit控件实现一个智能IP地址输入框。即使你是刚接触Qt的新手,也能通过本文理解核心实现原理。

u011186532的专栏 650

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

单一职责原则 对类来说,即一个类应该只负责一项职责。如A类负责两个不同的职责:职责1,职责2。当职责1需求变更而改变A时,可能造成职责2执行错误。所以需要将类A的粒度分解为A1,A2。 ①降低类的复杂度,一个类只负责一项职责。 ②提高类的可读性,可维护性。 ③降低变更引起的风险。 ④通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级...

m0_37564426的博客 410

2024年12月数据月报

2024年12月大数据月报,为您准备了阿里、字节、百度等大厂150多篇实践案例

SmartSi 2654

0.设计模式七大原则及其分类

设计模式是某类问题的通用的解决方案 1.设计模式的目的 1.代码重用性 2.可读性 3.可扩展性 4.可靠性 5.使程序呈现高内聚,低耦合的特性 2.设计模式七大原则 1.单一职责原则 1). 降低类的复杂度,一个类只负责一项职责。 2). 提高类的可读性,可维护性 3). 降低变更引起的风险 4). 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则 2.接口隔离原则. 接口隔离,最小化

我是60岁程序员 169

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

设计模式回顾——设计模式概念与基本原则

设计模式(Design pattern),是一套被反复使用、多数人知晓的、经过分类编目的、反复验证的代码设计经验总结。

只要思想不滑坡,想法总比问题多。 890

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

设计模式学习心得

设计模式

weixin_45522766的博客 1048

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

设计模式全解析:23种经典模式与七大原则的终极指南

本文系统解析23种设计模式,重点阐述七大核心设计原则(SRP、OCP、LSP、ISP、DIP、LoD、CRP),通过UML图示和Java代码实例演示应用方法。设计模式作为可复用的解决方案模板,能提升代码复用性、系统可维护性和团队协作效率。文章涵盖创建型(如单例、工厂方法)、结构型和行为型三大类模式,强调"优先组合而非继承"等实践准则,为构建灵活可扩展的软件架构提供系统化指导。通过将复杂问题分解为标准化解决方案,帮助开发者提高软件设计质量。

数字人生 1500

Java设计模式(七大原则和单例模式篇)

这里写目录标题1. Java设计模式的概述1.1 设计模式的目的及重要性1.2 设计模式的7大原则1.2.1 单一职责原则1.2.2 接口隔离原则1.2.3 依赖倒置原则1.2.4 里氏替换原则1.2.5 开闭原则(OCP)1.2.6 迪米特法则1.2.7 合成复用原则1.3 设计原则核心思想2. 设计模式3的种类型(23种模式)2.1创建型模式2.2 结构型模式2.3 行为型模式3. 模式的秘密开始3.1 单例模式(一共八种)3.1.1饿汉模式(静态变量):3.1.2饿汉模式(静态代码块):3.1.3懒汉

m0_46212244的博客 287

设计模式:分类及设计原则简介

设计模式,设计模式分类及面向对象的设计原则简介

maojian_ohhey的博客 362

【设计模式最终总结】概述、分类、原则

1 什么是设计模式 模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案。【A pattern is a successful or efficient solution to a recurring problem within a context】 软件模式是在软件开发中某些可重现问题的一些有效解决方法,软件模式的基础结构主要由四部分构成,包括问题描...

dizi9750的博客 156

游戏中的设计模式——第一篇 设计模式简介

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。一个类只负责一个功能领域中的相应职责。

Buling_0的博客 1185

Swift设计模式

设计模式分类 设计模式总体上可以分为三大类,具体如图: 设计模式 软件设计模式的概念 软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍...

qq_34003239的博客 993

【JAVA长虹键法】第一式 初识设计模式(23种设计模式)

设计模式第一期,初始设计模式。

4万+

【设计模式】设计模式

概述 设计模式介绍 设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是某类问题的通 用解决方案,设计模式(Design pattern)代表了最佳的实践。这些解决方案是众多软件开发人员经过相当长的 一段时间的试验和错误总结出来的。 设计模式的本质提高 软件的维护性,通用性和扩展性,并降低软件的复杂度。 <<设计模式>> 是经典的书,作者是 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlis

qq_44530108的博客 2307

设计模式——设计模式与设计原则

设计模式——设计模式与设计原则一、设计模式1、设计模式简介设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石。模式的经典定义:每个模式都描述了一个在我们的环...

weixin_34321753的博客 263

JAVA 设计模式简介

1 什么是设计模式 在软件工程中,设计模式是对软件设计中普遍存在的各种问题,所提出的 解决方案。 换句话说,设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计的 经验的总结。使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可靠性。 2. 设计模式原则 1、开闭原则(Open Close Principle) 开闭原则的意思是:对扩展开放,对修改封闭。在程序需要进行扩展的时候...

黑白灰的博客 232
上一篇: 项目构建与Apache Maven
下一篇: 单例模式
xcosy
博客等级 码龄7年 29粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值