常见的五种设计模式
https://www.runoob.com/design-pattern/factory-pattern.html
单例模式
**意图:**保证一个类仅有一个实例,并提供一个访问它的全局访问点。
**主要解决:**一个全局使用的类频繁地创建与销毁。
**何时使用:**当您想控制实例数目,节省系统资源的时候。
**如何解决:**判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
**关键代码:**构造函数是私有的。
应用实例:
1、一个班级只有一个班主任。
2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
使用场景:
- 1、要求生产唯一序列号。
- 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
- 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等
优点:
1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
2、避免对资源的多重占用(比如写文件操作)。
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
注意:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
实现
饿汉模式
类加载的同时, 创建实例.
public class SingletonHungry {//static 修饰成员变量,全局只有一个private static SingletonHungry instance = new SingletonHungry();//构造方法私有化,使类对象只有一个private SingletonHungry() {}
// 对外提供一个获取获取实例对象的方法
// 用static修饰方法public static SingletonHungry getInstance(){return instance;}
}
懒汉模式-单线程版
类加载的时候不创建实例. 第一次使用的时候才创建实例.
public class SingletonLazy {private static SingletonLazy instance = null;private SingletonLazy() {}public static SingletonLazy getInstance() {if (instance == null) {instance = new SingletonLazy();}return instance;}
}
懒汉模式-多线程版
上面的懒汉模式的实现是线程不安全的.
线程安全问题发生在首次创建实例时. 如果在多个线程中同时调用 getInstance 方法, 就可能导致 创建出多个实例.
一旦实例已经创建好了, 后面再多线程环境调用 getInstance 就不再有线程安全问题了(不再修改 instance 了)
加上 synchronized 可以改善这里的线程安全问题.
public class SingletonLazy2 {private static SingletonLazy2 instance = null;private SingletonLazy2() {}// 以下两种方法都可以
// 在获取成员变量时,先判断锁是否被占用
//
// 其实synchronized代码块只需要执行一次就够了,以现在的写法,只要调用了getInstance方法,都要竞争锁,锁竞争是非常耗费系统资源的
// 使用了synchronized就从用户态转到了内核态public static synchronized SingletonLazy2 getInstance() {if (instance == null) {
// 初始化过程只执行一次instance = new SingletonLazy2();}return instance;}public static SingletonLazy2 getInstance1() {synchronized(SingletonLazy2.class) {if (instance == null) {instance = new SingletonLazy2();}return instance;}}// 错误的!!!!!!!!!!!!
// public static SingletonLazy2 getInstance() {
// if (instance == null) {
// 此时已经判断instance为空,争抢锁之后就会创建一个新的实例对象
// synchronized (SingletonLazy2.class){
// instance = new SingletonLazy2();
// }
// }
// return instance;
// }}
懒汉模式-多线程版(改进)
以下代码在加锁的基础上, 做出了进一步改动:
- 使用双重 if 判定, 降低锁竞争的频率.
- 给 instance 加上了 volatile.
/*** 使用双重 if 判定, 降低锁竞争的频率.* 给 instance 加上了 volatile.** 加锁 / 解锁是一件开销比较高的事情. 而懒汉模式的线程不安全只是发生在首次创建实例的时候.* 因此后续使用的时候, 不必再进行加锁了.* 外层的 if 就是判定下看当前是否已经把 instance 实例创建出来了.* 同时为了避免 "内存可见性" 导致读取的 instance 出现偏差, 于是补充上 volatile .* 当多线程首次调用 getInstance, 大家可能都发现 instance 为 null, 于是又继续往下执行来竞争锁,* 其中竞争成功的线程, 再完成创建实例的操作.* 当这个实例创建完了之后, 其他竞争到锁的线程就被里层 if 挡住了. 也就不会继续创建其他实例.*/
//双重检查锁 DCL
public class SingletonDCL {//synchronized只能保证原子性和可见性,不能保证有序性(其他线程可能得到一个创建了对象(instance != null),但没有得到某些数据初始化的对象)//加上volatile保证有序性(可见性与有序性)private volatile static SingletonDCL instance = null;private SingletonDCL() {}public static SingletonDCL getInstance() {//为了让后面的线程不再获取锁,避免锁竞争if (instance == null) {synchronized (SingletonDCL.class) {//完成初始化操作,只执行一次if (instance == null) {instance = new SingletonDCL();}}}return instance;}
}
关于单例模式的饿汉和懒汉模式
- 工作中可以使用饿汉模式,因为书写简单且不易出现错
- 饿汉模式在程序加载时完成的初始化,但是由于计算机资源有限,为了节约资源,可以使用懒汉模式
- 懒汉模式就是在使用对象时再去完成初始化操作
- 懒汉模式在多线程模式可能出现线程安全问题
- 那么就需要使用synchronized包裹初始化代码块
- 初始化代码只执行一次,后序的线程在调用getInstance()时,依然会产生竞争锁,频繁进行用户态和内核态的切换,非常浪费所资源
- 这时候就是可以用double check lock(DCL)的方式,在外层加一个非空校验,避免无用的锁竞争
- synchronized只能保证原子性和可见性,不能保证有序性(其他线程可能得到一个创建了对象(instance != null),但没有得到某些数据初始化的对象),再使用volatile解决有序性问题
- 描述指令重排序可能出现的问题
工厂模式
**意图:**定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
**主要解决:**主要解决接口选择的问题。
**何时使用:**我们明确地计划不同条件下创建不同实例时。
**如何解决:**让其子类实现工厂接口,返回的也是一个抽象的产品。
**关键代码:**创建过程在其子类执行。
应用实例: 1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
**缺点:**每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
使用场景:
1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
3、设计一个连接服务器的框架,需要三个协议,“POP3”、“IMAP”、“HTTP”,可以把这三个作为产品类,共同实现一个接口。
**注意事项:**作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
工厂模式包含以下几个核心角色:
- 抽象产品(Abstract Product):定义了产品的共同接口或抽象类。它可以是具体产品类的父类或接口,规定了产品对象的共同方法。
- 具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。
- 抽象工厂(Abstract Factory):声明了创建产品的抽象方法,可以是接口或抽象类。它可以有多个方法用于创建不同类型的产品。
- 具体工厂(Concrete Factory):实现了抽象工厂接口,负责实际创建具体产品的对象。
实现
public static void main(String[] args) {ShapeFactory shapeFactory = new ShapeFactory();//获取 Circle 的对象,并调用它的 draw 方法Shape shape1 = shapeFactory.getShape("CIRCLE");//调用 Circle 的 draw 方法shape1.draw();//获取 Rectangle 的对象,并调用它的 draw 方法Shape shape2 = shapeFactory.getShape("RECTANGLE");//调用 Rectangle 的 draw 方法shape2.draw();//获取 Square 的对象,并调用它的 draw 方法Shape shape3 = shapeFactory.getShape("SQUARE");//调用 Square 的 draw 方法shape3.draw();}
模板模式
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
主要解决:一些方法通用,却在每一个子类都重新写了这一方法。
何时使用:有一些通用的方法。
如何解决:将这些通用算法抽象出来。
关键代码:在抽象类实现,其他步骤在子类实现。
应用实例:
1、在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。
2、西游记里面菩萨定好的 81 难,这就是一个顶层的逻辑骨架。
3、spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。
优点:
1、封装不变部分,扩展可变部分。
2、提取公共代码,便于维护。
3、行为由父类控制,子类实现。
缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
使用场景:
1、有多个子类共有的方法,且逻辑相同。
2、重要的、复杂的方法,可以考虑作为模板方法。
注意事项:为防止恶意操作,一般模板方法都加上 final 关键词。
实现
我们将创建一个定义操作的 Game 抽象类,其中,模板方法设置为 final,这样它就不会被重写。Cricket 和 Football 是扩展了 Game 的实体类,它们重写了抽象类的方法。
TemplatePatternDemo,我们的演示类使用 Game 来演示模板模式的用法。
public abstract class Game {abstract void initialize();abstract void startPlay();abstract void endPlay();//模板public final void play(){//初始化游戏initialize();//开始游戏startPlay();//结束游戏endPlay();}
}
public class Cricket extends Game {@Overridevoid endPlay() {System.out.println("Cricket Game Finished!");}@Overridevoid initialize() {System.out.println("Cricket Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Cricket Game Started. Enjoy the game!");}
}
public class Football extends Game {@Overridevoid endPlay() {System.out.println("Football Game Finished!");}@Overridevoid initialize() {System.out.println("Football Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Football Game Started. Enjoy the game!");}
}
public class TemplatePatternDemo {public static void main(String[] args) {//直接调用抽象类中的模板方法,模板方法中执行子类实现的方法Game game = new Cricket();game.play();System.out.println();game = new Football();game.play(); }
}
策略模式
意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:将这些算法封装成一个一个的类,任意地替换。
关键代码:实现同一个接口。
应用实例:
1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。
2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。
3、JAVA AWT 中的 LayoutManager。
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
使用场景:
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2、一个系统需要动态地在几种算法中选择一种。
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
策略模式包含以下几个核心角色:
- 环境(Context):维护一个对策略对象的引用,负责将客户端请求委派给具体的策略对象执行。环境类可以通过依赖注入、简单工厂等方式来获取具体策略对象。
- 抽象策略(Abstract Strategy):定义了策略对象的公共接口或抽象类,规定了具体策略类必须实现的方法。
- 具体策略(Concrete Strategy):实现了抽象策略定义的接口或抽象类,包含了具体的算法实现。
策略模式通过将算法与使用算法的代码解耦,提供了一种动态选择不同算法的方法。客户端代码不需要知道具体的算法细节,而是通过调用环境类来使用所选择的策略。
实现
我们将创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。Context 是一个使用了某种策略的类。
StrategyPatternDemo,我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。
public interface Strategy {public int doOperation(int num1, int num2);
}
public class OperationAdd implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}
}
public class OperationSubtract implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}
}
public class OperationMultiply implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 * num2;}
}
public class Context {private Strategy strategy;public Context(Strategy strategy){this.strategy = strategy;}public int executeStrategy(int num1, int num2){return strategy.doOperation(num1, num2);}
}
public class StrategyPatternDemo {public static void main(String[] args) {Context context = new Context(new OperationAdd()); System.out.println("10 + 5 = " + context.executeStrategy(10, 5));context = new Context(new OperationSubtract()); System.out.println("10 - 5 = " + context.executeStrategy(10, 5));context = new Context(new OperationMultiply()); System.out.println("10 * 5 = " + context.executeStrategy(10, 5));}
}
代理模式
意图:为其他对象提供一种代理以控制对这个对象的访问。
主要解决:在直接访问对象时带来的问题。
何时使用:想在访问一个类时做一些控制。
如何解决:增加中间层。
关键代码:实现与被代理类组合。
应用实例:
1、Windows 里面的快捷方式。
2、买火车票不一定在火车站买,也可以去代售点。
3、spring aop。
优点: 1、职责清晰。 2、高扩展性。 3、智能化。
缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
使用场景:按职责来划分,通常有以下使用场景: 1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。
注意事项: 1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。
实现
public interface Image {void display();
}
public class RealImage implements Image {private String fileName;public RealImage(String fileName){this.fileName = fileName;loadFromDisk(fileName);}@Overridepublic void display() {System.out.println("Displaying " + fileName);}private void loadFromDisk(String fileName){System.out.println("Loading " + fileName);}
}
public class ProxyImage implements Image{private RealImage realImage;private String fileName;public ProxyImage(String fileName){this.fileName = fileName;}@Overridepublic void display() {if(realImage == null){realImage = new RealImage(fileName);}realImage.display();}
}
public class ProxyPatternDemo {public static void main(String[] args) {Image image = new ProxyImage("test_10mb.jpg");// 图像将从磁盘加载image.display(); System.out.println("");// 图像不需要从磁盘加载image.display(); }
}
对比
工厂模式:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行
ShapeFactory shapeFactory = new ShapeFactory();
//获取 Circle 的对象,并调用它的 draw 方法
Shape shape1 = shapeFactory.getShape("CIRCLE");
模板模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
Game game = new Cricket();game = new Football();game.play();
策略模式:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换
Context context = new Context(new OperationAdd());
在模板模式中,我们在父类规定处理的流程,在子类实现具体处理。 如果我们将该模式用于生成实例,它就演变为工厂模式。
一个“策略”是一个 整体的(完整的) 算法,算法是可以被整体替换的。而模板方法只能被替换其中的特定点,算法流程是固定不可变的
相关文章:
常见的五种设计模式
https://www.runoob.com/design-pattern/factory-pattern.html 单例模式 **意图:**保证一个类仅有一个实例,并提供一个访问它的全局访问点。 **主要解决:**一个全局使用的类频繁地创建与销毁。 **何时使用:**当您想控制实例数目…...
pandas读取一个 文件夹下所有excel文件
我这边有个需求,是要求汇总一个文件夹所有的excel文件, 其中有.xls和 .xlsx文件,同时还excel文件中的数据可能还不一致,会有表头数据不一样需要一起汇总。 首先先遍历子文件夹并读取Excel文件: 使用os库来遍历包含子文…...
Python网页请求超时如何解决
在进行网络爬虫项目时,我们经常需要发送大量的请求来获取所需的数据。然而,由于网络环境的不稳定性,请求可能会因为超时而失败。请求超时可能导致数据获取不完整,影响爬虫的效率和准确性。此外,频繁的请求超时可能会被…...
虚幻引擎集成web前端<二>:UE4 像素流 与 web 通信
Vue 和 Unreal Engine (UE) 之间的通信可以通过多种方式实现。以下是一些建议的方法: 使用 Websockets:Websockets 是一种在客户端和服务器之间进行双向通信的技术。在 Vue 端,你可以使用一个 Websockets 库(如 socket.io…...
618-基于FMC+的XCVU3P高性能 PCIe 载板 设计原理图
基于FMC的XCVU3P高性能 PCIe 载板 一、板卡概述 板卡主控芯片采用Xilinx UltraScale16 nm VU3P芯片(XCVU3P-2FFVC1517I)。板载 2 组 64bit 的DDR4 SDRAM,支持 IOX16或者 JTAG 口,支持PCIe X 16 ReV3.0以及 FMC 扩展接口。…...
ABB UF C911B108 3BHE037864R010控制主板模块
ABB UF C911B108 3BHE037864R010 控制主板模块通常用于ABB的工业自动化和控制系统中,作为关键组件之一,用于执行控制、监测和通信任务。以下是通常情况下控制主板模块的一些产品功能: 高性能处理器:ABB UF C911B108 3BHE037864R01…...
基于SpringBoot开发的疫情信息管理系统
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 疫情信息管理系统,java项目。 eclipse和…...
手敲Cocos简易地图编辑器:人生地图是一本不断修改的书,每一次编辑都是为了克服新的阻挡
引言 本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢迎大家关注分享收藏订阅。 在上一篇文章,笔者给大家讲解了在Cocos独立游戏开发框架中,如何自定义实现Tile地图管理器,成功地在游戏中优化加载一张特大的地图。接下来…...
MySQL——修改数据库和表的字符编码
修改编码: (1)先停止服务 (2)修改my.ini文件 (3)重新启动服务说明: 如果是在修改my.ini之前建的库和表,那么库和表的编码还是原来的Latin1,要么删了重建,要么…...
中国人民大学与加拿大女王大学金融硕士——人生总要逼自己一把
我们每个人都是一个独特而丰富的个体,身上蕴藏着各种潜力和可能性。要不断去开发自己的潜能,不断学习和提升自己的知识和技能,保持对新知识和趋势的敏感。想要在职场上走得更远,就要逼自己一把,在职继续攻读硕士学位是…...
SAP MM学习笔记 - 错误 ME092 - Material mainly procured internally(原则上该物料只能内部调达)
购买依赖,购买发注的时候,会出一些错误或警告,碰到的时候,能解决的话,咱们就记录一下。 比如 Msg 番号 ME092 该品目原则上是内部调达。 如下图,本次出这个错误的原因是,ME51N做购买依赖&…...
【EI会议征稿】2023年智能科学与计算机工程国际学术会议(ISCE 2023)
2023年智能科学与计算机工程国际学术会议(ISCE 2023) 2023 International Conference on Intelligence Scicence andComputer Engineering 2023年11月3-5日 中国-西双版纳 迄今为止,人工智能研究在一些特殊领域取得了一定的实质性进展。然…...
Java多线程编程
目录 1、一个线程的生命周期 2、创建一个进程 2.1 Thread 方法 2.2 通过Runnable接口 2.3 通过继承Thread类本身 2.4 通过Callable和 Future创建进程 2.5 创建线程的三种方式的对比 3、线程的状态 4、线程同步 4.1 同步代码块 4.2 同步方法 5、使用wait和notify 6…...
Windows wsl2安装Ubuntu
wsl(Windows Subsystem for Linux)即适用于Windows的Linux子系统,是一个实现在Windows 10 / 11上运行原生Linux的技术。 wsl2 为其迭代版本,可以更好的在Windows上运行Linux子系统。 这里以 Windows 11 安装Ubuntu作为示例。 开启…...
csp-j模拟赛1总结
文章目录 T1T2T3结语 尾声 快csp考试了得多刷题啊… 题海战术,启动(玩OI玩的) 咳咳,进入正题. T1 T1 水题,小学数学即可搞定,话不多说,上代码: #include <iostream> using namespace std; int main(){int n,t;cin>>n>>t;bool y0;unsigned long long int nu…...
有哪些做流程图的软件?分享一些制作方法和注意事项
流程图是一种常用的图表,可以用于表示各种工作流程、系统架构、决策流程等。在现代工作生活中,制作流程图已经成为了必备的技能之一。本文将介绍一些常用的做流程图的工具,并分享一些制作方法和注意事项。 做流程图的工具 1.迅捷画图&#x…...
人工智能AI 全栈体系(一)
第一章 神经网络是如何实现的 这些年人工智能蓬勃发展,在语音识别、图像识别、自然语言处理等多个领域得到了很好的应用。推动这波人工智能浪潮的无疑是深度学习。所谓的深度学习实际上就是多层神经网络,至少到目前为止,深度学习基本上是用神…...
权限、认证与授权
权限、认证与授权 1、权限概述 (1)什么是权限 权限管理,一般指根据系统设置的安全策略或者安全规则,用户可以访问而且只能访问自己被授权的资源,不多不少。权限管理几乎出现在任何系统里面,只要有用户和…...
JAVA 的四种访问权限
在Java编程中,访问权限是非常重要的概念,因为它可以保证代码的安全性和封装性。访问权限有四种,分别是public、protected、default和private。 private:如果一个类的方法或者变量被private修饰,那么这个类的方法或者变…...
【个人博客系统网站】注册与登录 · 加盐加密验密算法 · 上传头像
【JavaEE】进阶 个人博客系统(3) 文章目录 【JavaEE】进阶 个人博客系统(3)1. 加盐加密验密算法原理1.1 md5加密1.2 md5验密1.3 md5缺漏1.4 加盐加密1.5 后端的盐值拼接约定1.6 代码实现1.6.1 加密1.6.2 验密1.6.3 测试 2. 博客…...
[H5动画制作系列] Sprite及Text Demo
参考代码: sprite.js: var canvas, stage, container; canvas document.getElementById("mainView"); function init() {stage new createjs.Stage(canvas);createjs.Touch.enable(stage);var loader new createjs.LoadQueue(false);loader.addEventListener(&q…...
目标检测YOLO实战应用案例100讲-毫米波辐射图像去模糊重建与目标检测
目录 前言 毫米波辐射图像去模糊重建研究现状 基于传统算法的图像去模糊重建...
Android10 SystemUI系列(一)概述
一、前言 由于笔者之前负责过SystemUI,之前没有抽空把很多东西整理出来,趁着最近不太忙,就慢慢动手梳理一下,顺便把自己遇到的问题也整理一下,当然自己之前主要看的是android11 之后的源码。这次主要是Android10 的源码,当然原理大差不差,也算是自己沉淀一下了 二、Sy…...
SpringMVC的常用注解,参数传递以及页面跳转的使用
目录 slf4j 常用注解 RequestMapping RequestParam RequestBody PathVariable 参数传递 首先在pom.xml配置文件中导入SLF4J的依赖 基础类型String 复杂类型 RequestParam PathVariable RequestBody 增删改查 返回值 void返回值 String返回值 modelString …...
Java“牵手”易贝商品列表数据,关键词搜索易贝商品数据接口,易贝API申请指南
ebay商城是一个网上购物平台,售卖各类商品,包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取ebay商品列表和商品详情页面数据,您可以通过开放平台的接口或者直接访问ebay商城的网页来获取商品详情信息。以下是两种常用方法的介绍&…...
java中HashMap如何根据value的值去获取key是多少
在Java中,HashMap是一种基于键值对存储数据的数据结构。HashMap并没有直接提供根据value获取key的方法。但你可以通过遍历HashMap的entrySet,找到对应的value,然后获取其对应的key。 以下是一个示例代码: public <K, V> K…...
Python|OpenCV-色彩空间之RGB轨迹调试板(5)
前言 本文是该专栏的第5篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 通常情况下,在处理图像需求的时候,需要掌握多个色彩空间的知识点。现实中,我们肉眼可以看到多种颜色,色彩是人的眼睛对于不同频率的光线的不同感受,其既是客观存在的,也是主观感知的。…...
安全生产:CVE-2020-11022/CVE-2020-11023漏洞解析
文章目录 一、前言二、漏洞原理三、修复方案3.1 升级jQuery3.2 1.x 升级至 3.x 需要考虑的问题3.2.1 table表格元素自动添加tbody3.2.2 方法变更 3.3 jquery migrate是什么 四、拓展阅读 一、前言 代码安全扫描阶段,前端资源审计发现jQuery版本过低导致生产系统存在…...
手写Spring:第17章-通过三级缓存解决循环依赖
文章目录 一、目标:通过三级缓存解决循环依赖二、设计:通过三级缓存解决循环依赖2.1 通过三级缓存解决循环依赖2.2 尝试使用一级缓存解决循环依赖 三、实现:通过三级缓存解决循环依赖3.1 工程结构3.2 通过三级缓存解决循环依赖类图3.3 设置三…...
C#使用proto
写多了go代码,被go mod tidy惯坏了,还以为全天下的都很好用呢,结果发现并不是这样。尤其是项目组的proto还是又封了个工具直接就能跑得,导致以为没那么复杂的事情变得复杂了起来。是有两套生成的规则,时间有点晚&#…...
网站统计代码添加/专业seo培训学校
[oracle] to_date() 与 to_char() 日期和字符串转换 to_date("要转换的字符串","转换的格式") 两个参数的格式必须匹配,否则会报错。 即按照第二个参数的格式解释第一个参数。 to_char(日期,"转换格式" ) 即把给定的日期按照“转换…...
电子商务网站有哪些内容/关键词完整版
密集而有序的弹道攻击 以及有序的动态群体角色冲锋 带来的视觉冲击力极强 哪怕是像素级的单位 所造成的画面感也可以是宏伟的 转载于:https://www.cnblogs.com/dandansang/p/7133610.html...
网站建设服务合同是否缴纳印花税/四川旅游seo整站优化站优化
Java 基础语法 一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。 对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,…...
有没有专门做av字幕的网站/北京网络营销咨询公司
本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等 本篇介绍与内核对象同步相关的Event对象和Mutex对象 AutoResetEvent和ManualResetEvent 同步事件有两种:AutoResetEvent和 ManualResetEvent。主要用户线程之间…...
国外专卖模板的网站/公司网络优化方案
本文实例讲述了PHP使用redis实现统计缓存mysql压力的方法。分享给大家供大家参考,具体如下:<?php header("Content-Type:text/html;charsetutf-8");include lib/mysql.class.php;$mysql_obj mysql :: getConn();// redis$redis new Redi…...
app制作开发费用多少/最好的关键词排名优化软件
方格填数 题目描述 在2行5列的格子中填入1到10的数字。 要求:相邻的格子中的数,右边的大于左边的,下边的大于上边的。 如下图所示的2种,就是合格的填法。 请你计算一共有多少种可能的方案。 输出 请输出该整数,不要…...