Java设计模式中的设计原则
[TOC]
文章参考:https://www.cnblogs.com/zuoxiaolong/p/pattern26.html
概述我们在学习设计模式的时候,我们都知道有23种设计模式,7种设计原则。那么设计模式和设计原则到底有什么对应关系呢?或者说你清楚的知道一直在用的每种设计模式都遵循哪些设计原则,破坏了哪些设计原则吗? 下面,我们将会一一来分析一下。
下面,我们依次来回顾一下,这23种设计模式
设计原则: 设计模式(总纲)
创建型: 单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式
结构型: 代理模式、适配器模式、装饰器模式、桥接模式、组合模式 享元模式、外观模式
行为型: 观察者模式、模板方法模式、命令模式、状态模式、职责链模式、 解释器模式、中介者模式、访问者模式、策略模式、备忘录模式、迭代器模式
以上便是设计模式的分类,以及每个分类下的设计模式,可以看到其中行为型模式的个数为最多,结构型次之,创建型设计模式最少。
好的,我们再回顾一下设计原则:
1、单一职责原则: 每个类应该有且只有一个职责。(类不应该承担多个职责)
2、开闭原则: ...
Java设计模式中的设计原则
[TOC]
文章参考:https://github.com/iluwatar/java-design-patterns
概述在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。我们将在下面的几节中依次来介绍这 7 条原则。
首先,我们先来看一下,到底是哪七大原则(当然也有说是六大原则,不包含合成复用原则)。
单一职责原则
开闭原则
里氏替换原则
接口隔离原则
迪米特法则
依赖倒置原则
合成复用原则
1、单一职责原则就一个类而言,应该仅有一个引起它变化的原因,如果你能想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责.应该把多于的指责分离出去,分别再创建一些类来完成每一个职责.
单一职责原则的英文名称是Single Responsibility Principle,简称是SRP。这个原则说起来很简单,就是一个接口或者类只有一个职责,或者说类和接口的设计只能有一个原因引起他变化。
这句话说起来容易,对于职责的边界划分还是很难的。每个类应该有且只有一个职责。( ...
Java设计模式中的设计原则
[TOC]
概述文章参考:https://zhuanlan.zhihu.com/p/86740798
关于JDK动态代理,想必小伙伴都知道,它只能代理接口!但是有的小伙伴可能会有疑问,为什么它只能代理接口,不能代理类呢?这里借助某位技术大佬的话–”源码面前,了无秘密“,下面咱们就一起看下JDK动态代理源码实现,最后再探讨下JDK动态代理为什么不能代理类。
关于JDK动态代理,想必小伙伴都知道,它只能代理接口!但是有的小伙伴可能会有疑问,为什么它只能代理接口,不能代理类呢?
动态代理是在运行期间通过接口生成代理类的,与静态代理相比更加灵活,但是也有一定的限制,
第一是代理对象必须实现一个接口,否则会报异常,因为人家原理就是根据接口来生成代理对象的。
第二是有性能问题,因为是通过反射来实现调用的,所以比正常的直接调用来得慢,并且通过生成类文件也会多消耗部分方法区空间,可能引起Full GC。
VSCode配置Remote-SSH相关
[TOC]
概述文章参考:https://leonz_z.gitee.io/face2keyboard/2021/02/02/MacOSC/
文章参考:https://www.yht7.com/news/167429
VSCode配置Remote-SSH相关
[TOC]
概述文章参考:https://blog.csdn.net/qq_17229141/article/details/106396797
cmake学习之add_custom_command命令
[TOC]
概述该指令用于添加自定义命令,实现某些操作。比如,编译之前进行一些文件拷贝操作等。
该命令有两种使用方式:
使用方式配合 add_custom_target 使用配合 add_custom_target 使用,该命令生成 add_custom_target 的依赖;
123456789101112131415add_custom_command(OUTPUT output1 [output2 ...] COMMAND command1 [ARGS] [args1...] [COMMAND command2 [ARGS] [args2...] ...] [MAIN_DEPENDENCY depend] [DEPENDS [depends...]] [BYPRODUCTS [files...]] [IMPLICIT_DEPENDS <lang1> dep ...
C++11并发编程之lock_guard和unique_lock基础学习
[TOC]
文章参考:https://www.cnblogs.com/haippy/p/3237213.html
文章参考:https://www.cnblogs.com/haippy/p/3346477.html
概述C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢导致程序出现未定义的行为。通常的做法是在修改共享数据成员的时候进行加锁–mutex。在使用锁的时候通常是在对共享数据进行修改之前进行lock操作,在写完之后再进行unlock操作,进场会出现由于疏忽导致由于lock之后在离开共享成员操作区域时忘记unlock,导致死锁。
互斥类的最重要成员函数是lock()和unlock()。在进入临界区时,执行lock()加锁操作,如果这时已经被其它线程锁住,则当前线程在此排队等待。退出临界区时,执行unlock()解锁操作。更好的办法是采用”资源分配时初始化”(RAII)方法来加锁、解锁,这避免了在临界区中因为抛出异常或return等操作导致没有解锁就退出的问题。极大地简化了程序员编写mutex相关的异常处理代码。C++11的标准库中提 ...
01.C++开发之环境搭建
[TOC]
概述文章参考:https://www.cnblogs.com/yanqingyang/p/12731855.html
安装Cmakeubuntu环境安装命令
1sudo apt install cmake
卸载原来的cmake版本:
1sudo apt-get remove cmake
MacOS环境下载地址:https://github.com/Kitware/CMake/releases/download/v3.26.5/cmake-3.26.5-macos-universal.dmg
C++之const关键字基础
[TOC]
文章参考:https://zhuanlan.zhihu.com/p/37514756
文章参考:https://zhuanlan.zhihu.com/p/103215046
概述 定义变量时的限定符,表示变量值不能改变。
12const int bufSize = 512;bufSize = 512; // 错误:试图向const对象写值
由于const一旦创建就不可更改,所以const对象必须初始化(否则定义一个默认值且不可修改的变量没有任何意义)。
123const int i = get_size(); // 正确const int j = 42; // 正确const int k; // 错误:未初始化
使用值传递初始化时,被初始化的对象是否为const与初始化对象是否为const无关。也即,const对象与非const对象可以互为初始化。
const修饰一个变量时,一定要给这个变量初始化,若不初始化,在后面也不能初始化。
const作用:
可以用来定义常量,修饰函数参数,修饰函数返回值 ,且被const修饰的东西,都受到强制保护,可以预防其 ...
C++基础之const关键字作用学习
[TOC]
概述文章参考:https://zhuanlan.zhihu.com/p/37514756
文章参考:https://zhuanlan.zhihu.com/p/103215046
文章参考:https://www.zhihu.com/question/35614219
定义变量时的限定符,表示变量值不能改变。
12const int bufSize = 512;bufSize = 512; // 错误:试图向const对象写值
由于const一旦创建就不可更改,所以const对象必须初始化(否则定义一个默认值且不可修改的变量没有任何意义)。
123const int i = get_size(); // 正确const int j = 42; // 正确const int k; // 错误:未初始化
使用值传递初始化时,被初始化的对象是否为const与初始化对象是否为const无关。也即,const对象与非const对象可以互为初始化。
const修饰一个变量时,一定要给这个变量初始化,若不初始化,在后面也不能初始化。
const作用:
可以用来定义常量,修饰函 ...