Java设计模式汇总详解

设计模式

设计模式是很多程序员总结出来的最佳实践。曾经在刚开始写项目的时候学习过设计模式,在开发过程中,也主动或者被动的使用过。现在写代码虽说不会特意明确在用哪种设计模式,但潜移默化的写出来公认的最佳实践代码,毕竟看的比较清爽。为什么再看一遍设计模式,主要有几个原因:第一,很多优秀的源码基本都使用了设计模式,明确设计模式能够更好的看源码。第二,很多中间件设计理念也是基于设计模式的,还有其他的语言,都有自己的设计最佳实践。对于我来说,设计模式始于java,不止于java。第三,有了这种规范,可以更好的和他人沟通,言简意赅

设计模式原则

1.单一职责原则,就是一个类只负责做一件事情。这样就可以做到解耦合的效果,让代码看起来比较清爽,也体现了java的封装性。还有个原则叫迪米特法则,就是一个对象对另一个对象有尽量少的了解,说的也是解耦合的事情。

2.里氏替换原则和依赖导致原则,说的是继承的事情。父类可以做的事情,子类都可以去做,子类可以尽量去依赖父类去做事情;但是反过来,父类不能依赖子类去做一些事情。体现了java的继承特性。

3.接口隔离原则,接口也应该尽可能的隔离开来。其实类写多了,的确耦合性低,为了让他们交流起来,用的最多的就是接口,毕竟只需要知道做什么,怎么做,去访问那个具体的类吧。

4.开闭原则,对修改关闭,对拓展开放。就是代码需要有很好的延展性,对原有代码结构不能破坏。

创建者模式

创建者模式就是为了用优雅的方式创建我们使用的类。

1.简单工厂模式
这个用的比较少,就是有个工厂,告诉你我要什么东西,你造好了给我就行。

示例

public interface Ball{public String create();}public class Soccer implements Ball{@Overridepublic String create(){return "give you a scoccer";}}public class Basketball implements Ball{@Overidepublic String create(){return "give you basketball";}}public class EasyBallFactory{public static Ball createBall(String name){if(name.equals("basketball")){return new BasketBall();}else if(name.equals("soccer")){return new Soccer();}else{return null;}}public static void main(String[] args){Ball soccer = EasyBallFactory.createBall("soccer");Ball basketball = EasyBallFactory.createBall("basketball");System.out.println(soccer.create());System.out.println(basketball.create());}}

2.工厂模式
这个其实和简单工厂模式差不太多,就是将工厂继续拆分,比如说刚刚EasyBallFactory是一个总工厂,我们现在拆分成SoccerFactory和BasketBallFactory分别生产足球和篮球。某个工厂内部可以根据需求生产不同的产品,比如说soccer可以生产不同大小的出来。

示例

public interface BallFactory{public Ball create();}public class SoccerFactory implements BallFactory{@Override public Ball create(){return null;}}public class BasketBallFactory implements BallFactory{@Overridepublic Ball create(){return null;}}

3.抽象工厂模式
抽象工厂模式主要设计产品组的概念,就是某一个工厂生产出配套的一系列产品。例如,在生产足球的同时,SoccerFactory还可以生产与之配套的足球杂志。

示例

public interface Journal{public String create();}public class SoccerJournal implements Journal{@Override public String create(){return "give you a Soccer Journal";}}public class SoccerFactory implements BallFactory{@Overridepublic Ball create(){return new Soccer;}public Journal createJournal(){return new SoccerJournal();}}

4.单例模式
单例模式有很多种形式,最佳实践应该是两重判断,保证只new出来一个。单例可以说是非常普遍的设计模式了。单例就是指在服务容器的生命周期中只能有这么一个。比如说Servlet、Spring中注入的Bean等等都是单例的。

示例

public class ShiroUtils{public static Session session;public static Session getSession(){if(session == null){synchronized(ShiroUtils.class){if(session == null){session = SecurityUtils.getSubject().getSession();}}}return session;}}

5.建造者模式
将一个复杂对象分布创建。如果一个超大的类的属性特别多,我们可以把属性分门别类,不同属性组成一个稍微小一点的类,再把好几个稍微小点的类窜起来。比方说一个电脑,可以分成不同的稍微小点的部分CPU、主板、显示器。CPU、主板、显示器分别有更多的组件,不再细分。

示例

@Datapublic class Computer{private CPU cpu; // cpu是一个接口,有不同实现如InterCPU AMDCPU等private MainBoard mainBoard; // mainBoard是个接口,有不同的实现private DisPlayer disPlayer; // diaPlay是一个接口,有不同的实现}public abstract class Builder{abstract void buildCPU();abstract void buildMainBoard();abstract void buildDisPlayer();abstract Computer createComputer();}public class ZhangBuilder extends Builder{private Computer computer = new Computer();@Overridevoid buildCPU(){computer.setCpu(new InterCPU());}@Overridevoid buildMainBoard(){computer.setMainBoard(new AMainBoard());}@Overridevoid buildDisPlayer(){computer.setDisPlayer(new ADisPlayer());}@OverrideComputer createComputer(){return computer;}}

SpringBoot几乎将所有的配置都写到了java代码中,大量的配置不得不让配置类采用建造者模式,这样层次比较清晰。

6.原型模式
原型模式用的比较少,用于创建重复对象。需要实现Cloneable 可以选择重写clone()方法。clone分为浅克隆和深克隆。浅克隆只是克隆引用,对象还是一个。深克隆是对象也新创建了一个。

示例

@Data@Builderpublic class User implements Cloneable{private String name;private int age;@Overrideprotected User clone() throws CloneNotSupportedException{return new User(this.name,this.age);}public static void main(String[] args) throws CloneNotSupportedException{User user1 = new User("dksa",28);User user2 = user1.clone();user1.setAge(19);System.out.println(user2.getAge()); //28}}

结构型模式

上面的设计模式可以帮助我们轻松的创建出对象,下面看几个对象之间的模型。

7.代理模式
Spring的AOP用的是动态代理,何为动态不看了,用过Spring的小伙伴都知道吧。单纯看一下最基础代理模式是什么样的。代理就是,一个对象辅助另一个对象去做某件事,同时还可以增加一点辅助功能。例如,你买车,的确是你花钱把车买到了,但是你不可能直接去和厂家谈吧,你应该通过4S店购买,同时4S店帮助你入保险扣税等操作,最终你才得到了你想要的车。

示例

public interface Buy{public void buyCar();}public class People implements Buy{@Override public void buyCar(){System.out.println("we have a car");}}public class ProxyPeople implements Buy{private People people;public ProxyPeople(People people){this.people=people;}@Overridepublic void buyCar(){System.out.println("4s店帮你交税,上保险等");people.buyCar();}public static void main(String[] args){Buy buy = new ProxyPeople(new People);buy.buyCar();}}

8.适配器模式
适配器,顾名思义,是让两个不兼容的东西可以一起工作。例如插座的电源是220V,手机直接给他220V 50HZ的交流电我相信一般都会直接炸了(除了诺基亚…)手机充电器就进行了适配,将电压变小,交流电变成直流电。除了这种需要改变属性的操作(比较好说,不举例子了),适配器还用于在接口继承方面。假设一个顶级接口有一大堆方法需要实现类实现,我新写了个类只是想选择的实现一两个接口,那其他的方法我是不是都需要实现一下,即使是空实现(单纯实现,不进行任何逻辑操作),这是我们就需要一个适配器类,空实现那些方法,我的新类只需要继承这个适配器类就好了,要是想实现某个方法,只需要重写掉配置类中对应的方法就好。

示例

public interface ATopIntf{public void one();public void two();public void three();}public class Adapter implements ATopIntf{@Override public void one(){}@Override public void two(){}@Override public void three(){}}public class You extends Adapter{@Overridepublic void one(){super.one();System.out.println("one");}}

9.桥接模式
就是用于抽象化和实现化的解耦。又是解耦,貌似设计模式就是教我们如何优雅的解耦。提高了代码的拓展性,并且可以实现代码的动态切换。 最开始的Ball、Soccer、BasketBall接着用,增加新的类。

示例

public class BallCut{private Ball ball;public Ball getBall(){return ball;}public void setBall(Ball ball){this.ball = ball;}public void create(){System.out.println(ball.create());}public static void main(String[] args) {BallCut ballCut = new BallCut();ballCut.setBall(new Soccer());ballCut.create();ballCut.setBall(new BasketBall());ballCut.create();}}

10.装饰模式
一个装饰类,在原来类的基础上增加一点功能。是不是和代理模式很像,我甚至可以将整个代码搬过来照样可以说的通的。这两个模式意思上有点差别,代理模式是原对象做不了那件事,必须让代理对象去做,主导侧重于代理对象,比如说买车。装饰模式是说,就是让原对象直接去做这件事,只是功能上增强一点,主导在于原对象。比如说炒菜的时候撒点盐。

11.外观模式
又称门面模式,就是一个门面,一个操作无需让对象知道其内部实现的复杂度,尽量让用户感知到是非常简单的。这就是为什么我们controller层尽量(或者说一定)少些业务逻辑,让controller层只是起到一个传参和通用性参数校验的功能,剩下的全交给service去做吧。我们还需要在代码中不断将“长得”特别长的代码封装成一个方法,“让处处都有好看的外观”。看一下我们曾写过的代码,这里只起到了传参的作用,究竟这个足球是怎么创建出来的,客户端不必担心。

示例

public static void main(String[] args) {Ball soccer = EasyBallFactory.createBall("soccer");System.out.println(soccer.create());}

12.组合模式
组合模式是将存在某种包含关系的数据组织在一起,典型的例子就是树状结构。例如菜单功能,一个菜单除了自己该有的属性,还可能包含子菜单,创建的时候可以使用递归的方法。

示例

@Datapublic class Menu{private String name;private int type;private List<Menu> childMenus;}

13.享元模式
享元模式尽可能的让用户复用已经有的对象,从而避免造成反复创建对象的资源浪费。首先就会想到数据库连接池还有String常量池,延伸一下,几乎所有和缓存有关的代码,多少都会用到享元模式。享元模式要求大部分的对象可以外部化。这边要说两个概念,享元模式对象的属性可以分为两个部分,内部状态和外部状态,内部状态是指不会随环境而改变的值,比如说个人信息,外部状态是指随环境改变的值,不能进行共享的信息,如某大学生选修的课程。

示例

public abstract class Flyweight{//内部信息private String name;private String age;//外部信息private final String subject;protected Flyweight(String subject){this.subject = subject;}//行为public abstract void exam();public String getSubject(){return subject;}}
public class RealFlyweight extends Flyweight{@Overridepublic void exam(){System.out.println(this.getSubject()+" is examing...");}public RealFlyweight(String subject){super(subject);}}
public class FlyweightFactory{private static HashMap<String,Flyweight> pool = new HashMap();public static Flyweight getFlyweight(String subject){Flyweight flyweight = null;if(pool.containsKey(subject)){flyweight=pool.get(subject);}else{flyweight = new RealFlyweight(subject);pool.put(subject, flyweight);}return flyweight;}public static void main(String[] args) {System.out.println(pool.size());getFlyweight("math");System.out.println(pool.size());getFlyweight("english");System.out.println(pool.size());getFlyweight("math");System.out.println(pool.size());}}

行为型模式

创建了对象,对象之间有了结构关系,就要看下如何相互作用了。

14.策略模式
定义一组算法, 将每个算法都封装起来, 并且使它们之间可以互换。可以说是一组算法的封装,根据客户端给出的不同要求,进行不同的运算。比如下面这个简易计算器。

示例

public interface Stategy{public int doOperation(int num1, int num2);}public class OperationAdd implements Stategy{@Overridepublic int doOperation(int num1, int num2){return num1 + num2;}}public class OperationSubstract implements Stategy{@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 + 8 =" + context.executeStrategy(10,8));context = new Context(new OperationSubstract);System.out.println("10 - 8 = " + context.executeStrategy(10,8));}}

15.观察者模式
定义了一种一对多的依赖关系,当一个对象(被观察者)状态改变的时候,所有依赖于该对象的观察者都会被通知,从而进行相关操作。很多中间件都依赖于观察者模式,例如RabbitMQ,还有那些事件驱动模型(好像node就是)。

示例

@Datapublic class Student{public String name;public Student(String name){this.name=name;}public void dosomething(){System.out.println(getName()+"交卷");}}
public class Teacher{private Set<Student> students = new HashSet<>();public void addStudent(Student student){student.add(student);}public void doNotify(){for(Student student:students){student.dosomething();}}public static void main(String[] args) {Teacher teacher = new Teacher();Student student = new Student("小明");Student student1 = new Student("小红");teacher.addStudent(student1);teacher.doNotify();}}

16.责任链模式
责任链模式为请求创建一个接收者对象的链,对发送者和接受者进行解耦合。filter链就是责任链模式。

示例

public abstract class Handler{private Handler nextHandler;public final Response handleMessage(Request request){Reponse reponse = null;if(this.getHandlerLevel().equals(request.getRequestLeval())){reponse = this.echo(request);}else{if(this.nextHandler != null){reponse = this.nextHandler.handleMessage(request);}else{reponse = new Reponse();}}return reponse;}public Handle getNextHandler(){return nextHandler;}public void setNextHandler(Handler nextHandler){this.nextHandler = nextHandler;}protected abstract Level getHandleLevel();protected abstract Response echo(Request request);}

17.模板方式模式
一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

SpringBoot为用户封装了很多继承代码,都用到了模板方式。

示例

public abstract class DBTemplate{abstract void open();abstract void select();abstract void close();public final void selectTemplate(){open();select();close();}}
public class MysqlDB extends DBTemplate{@Overridevoid open(){System.out.println("MYsql open...");}@Overridevoid select(){System.out.println("MYsql select...");}@Overridevoid close(){System.out.println("MYsql close...");}public static void main(String[] args){DBTemplate mysql = new MysqlDB();mysql.selectTemplate();}}

18.状态模式
简单来说,就是一个对象有不同的状态,根据状态不同,可能有不同的行为。

示例

public interface State {public void doaction(Context context);}public class Startstate implements State {public void doaction(Context context) {System.out.println("Player is in start state");context.setstate(this);}public String tostring(){return"Start State"}}public class Stopstate implements State {public void doaction(Context context){System. out. println("Player is in stop state")context. setstate(this):}public String tostring() {return " stop state";}}public class Context{private State state;public Context(){state = null;}public void setState(State state){this.state = state;}public State getState(){return state;}}public class StatePatternDemo{public static void main(String[] args){Context context = new Context();StartState startState = new StartState();startState.doAction(context);System.out.println(context.getState().toString());StopState stopState = new Stop State();stopState.doAction(context);System.out.println(context.getState().toString());}}

19.迭代器模式
提供一个方法,可以顺序访问一个对象内部的各个元素,不需要知道内部构造。现在基本很少自己实现迭代器了,基本成熟的框架或者强大的JDK都会给出访问的方法,比如说java中iterator。这样做主要是进一步封装对象内部的结构,让行为和结构想耦合。

20.命令模式
命令模式是将请求以命令的形式包裹在对象中,并传递给对象,调用对象寻找到处理该命令的合适的对象,并将该命令传递给相应的对象,该对象执行。简单点说就是不同请求都封装成一个对象,不同的请求调用不同的执行者。

示例

//干活的对象public class Receiver{public void doSomething(){System.out.println("Receiver干活");}}//命令对象public abstract class Command{public abstract void exectue();}//命令实现public class ConcreateComand extends Command{//干活人private Receiver receiver;public ConcreateCommand(Receiver receiver){this.receiver = receiver;}@Overridepublic void exectue(){this.receiver.doSomething();}public static void main(String[] args) {Receiver receiver = new Receiver();Command command = new ConcreateCommand(receiver);command.exectue();}}

21.备忘录模式
相当于做一个快照,在不破坏对象本身结构的情况下,记录对象的一个状态,合适的时候可以恢复到这种状态。数据库做事务回滚的时候就用了这种方式。这里需要注意的是,对象不与备忘录本身耦合,而是跟备忘录管理类耦合(就是List<备忘录>)。

示例

@Data//备忘录public class Memento{private String state;}@Date//某对象public class Originator{private String state;public Memento saveStateToMemento(){return new Memento(state);}public void getStateFromMemento(Memento Menmento){state = Memento.getState();}}//备忘录管理public class CareTaker{private List<Memento> mementoList = new ArrayList<Memento>();public void add(Memento state){mementoList.add(state);}public Memento get(int index){return mementoList.get(index);}public static void main(String[] args) {Originator originator = new Originator();CareTaker careTaker = new CareTaker();originator.setState("State *1");originator.setState("State *2");careTaker.add(originator.saveStateToMemento());originator.setState("State *3");careTaker.add(originator.saveStateToMemento());originator.setState("State *4");System.out.println("Current State:" + originator.getState());originator.getStateFromMemento(careTaker.get(0));System.out.println("First saved State:" + originator.getState());originator.getStateFromMemento(careTaker.get(1));System.out.println("Second saved State:" + originator.getState());}}

22.访问者模式
当对特定角色进行访问的时候,需要通过访问者进行访问。一个对象不太方便被你直接访问的时候,你需要将自己的引用交给访问者,通过访问者去访问该对象。

23.中介者模式
降低对象或者说事物之间通讯的复杂性,降低耦合。比如说分布式系统中,不是需要实时反馈的操作,我们无需直接对接,只需将想做的事告诉中间件,中间件告诉另外一个系统。比如说,访问(用户点击)一条新闻操作,同时需要记录是谁访问了什么新闻,同时给新闻浏览次数加1,还要实时更新用户喜好…总之要更新n个数据库表,甚至还要操作像ES,Mongo等多个中间件数据。但是对于用户来说,我只是做了一个点击操作,希望得到的结果就是看条新闻啊,你这么多操作,搞这么慢,用户体验很差啊,而且并发量也很低,那不如做成两个小系统,A系统,拉取新闻,推送,并组装一个信息扔给MQ中间件,ok,结束,用户看到新闻。然后B系统监听,得到这个消息,进行各种更新,这里,这个中间件就是我们的中介。

示例

public class ChatRoom{public static void showMessage(User user, String message){System.out.println(new Date().toString() + "{" + user.getName() + "} :" + message);}}@Datapublic class User{private String name;public User(String name){this.name = name;}public void sendMessage(String message){ChatRoom.showMessage(this, message);}public static void main(String[] args) {User robert = new User("Robert");User tom = new User("Tom");robert.sendMessage("你好 tom");tom.sendMessage("你好 robert")}}

24.解释器模式
构建一种翻译方式,将某种语言或描述翻译成我们很好理解的语言或者描述。这里很好理解的意思是看得懂,看的快。我们可以将Map看作一个很好的编译器,key你可以存放一个非常小的字符串,value理论上你可以存放任何东西。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php中reset函数,PHP reset()函数

实例 1所有相关方法的演示&#xff1a;$people array("Peter", "Joe", "Glenn", "Cleveland");echo current($people) . ""; // The current element is Peterecho next($people) . ""; // The next element of …

【OpenCV 例程200篇】229. 特征描述之 LBP 算子比较(skimage)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】229. 特征描述之 LBP 算子比较&#xff08;skimage&#xff09; 局部二值模式&#xff08;LBP&#xff0c;Local binary patterns&#xff09;是一种用来描述图像局部纹理特征的算子&#xff0c;它具…

Java多线程的使用

无论在我们的工作中还是在我们的生活中&#xff0c;我们都会用到多线程的知识&#xff0c;今天就给大家讲一下如何使用多线程。 序幕 线程的启动 如何使线程暂停 如何使线程停止 线程的优先级 线程安全相关的问题 我们首先要知道进程和线程分别是什么&#xff1f; 进程 - 进…

oracle 存储过程 db,oracle数据库的存储过程是什么?

oracle数据库的存储过程&#xff1a;一组为了完成特定功能的SQL语句集&#xff0c;经编译后存储在数据库中。存储过程是由流控制和SQL语句书写的过程&#xff0c;这个过程经编译和优化后存储在数据库服务器中&#xff0c;应用程序使用时只要调用即可。存储过程(Stored Procedur…

【OpenCV 例程200篇】230. 特征描述之 LBP 统计直方图

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】230. 特征描述之 LBP 统计直方图 局部二值模式&#xff08;LBP&#xff0c;Local binary patterns&#xff09;是一种用来描述图像局部纹理特征的算子&#xff0c;它具有旋转不变性和灰度不变性的优点…

论单线程和多线程

在我们日常的项目开发过程中进场会接触到单线程或多线程的知识&#xff0c;那么到底多线程好还是单线程好呢&#xff1f;单线程和多线程的区别又是什么呢&#xff1f;下面我们来看看它们的区别以及优缺点分析及实例展示。 一、线程的含义 线程&#xff1a;每一个任务称为一个…

oracle 表空间初始分配,在 Oracle 中创建用户时,若未提及 DEFAULT TABLESPACE 关键字,则 Oracle 就将 ( )表空间分配给用户作为默认表空间。...

【多选题】现代职业高尔夫运动,主要有如下构成要素,即:高水平的职业球员、( )、观众的积极参与、( )和( )。【判断题】凝点较高的含蜡原油,凝点附近粘温曲线很陡,经济进站油温常略高于凝点。( )【单选题】以下哪项不是固有免疫的物理屏障作用【多选题】下列各项中不属于“木”的…

【OpenCV 例程200篇】232. 特征描述之频谱方法

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】232. 纹理特征之频谱方法 4.3 纹理特征之频谱方法 傅里叶谱可以描述图像中的周期性或半周期性二维模式的方向性&#xff0c;因此可以基于傅里叶变换对纹理进行频谱分析。 纹理与图像频谱中的高频分…

并发编程的目的和挑战

并发编程的目的与挑战 并发编程的目的是为了让程序运行得更快。启动更多的线程并不一定就能让程序最大限度地并发执行。 希望通过多线程执行任务让程序运行得更快&#xff0c;会面临非常多的挑战。比如&#xff1a; 上下文切换的问题死锁的问题硬件和软件的资源限制问题上下文…

java制作oracle程序,Java程序操作Oracle两种方式之简单实现

Java程序操作Oracle两种方式之简单实现1.通过JDBC-ODBC桥连接Oracle数据库(1)创建odbc源&#xff0c;在控制面板->管理工具->数据源(odbc)中添加DSN,比如取名为wangtao,选择一个Service,输入用户名密码&#xff0c;测试连接&#xff0c;若通过说明成功&#xff1b;(注意&…

【OpenCV 例程200篇】233. 区域特征之矩不变量

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】233. 区域特征之矩不变量 4.4 区域特征之矩不变量 矩是概率与统计中的一个概念&#xff0c;是随机变量的一种数字特征。矩函数在图像分析中有着广泛的应用&#xff0c;如模式识别、目标分类、图像编…

oracle ip策略,ip rule -- 路由策略数据库管理命令

ip rule -- 路由策略数据库管理命令.8.ip rule -- 路由策略数据库管理命令8.1.缩写rule、ru8.2.对象路由策略数据库的规则用于控制选择路由的算法。Internet上采用的路由算法一般是基于数据包目的地址的。理论上&#xff0c;也可以由TOS域决定&#xff0c;不过这没有实际应用。…

【OpenCV 例程200篇】231. 特征描述之灰度共生矩阵(GLCM)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】231. 特征描述之灰度共生矩阵&#xff08;GLCM&#xff09; 4.2.4 灰度共生矩阵&#xff08;GLCM&#xff09; 灰度共生矩阵&#xff08;Gray level co-occurrence matrix&#xff0c;GLCM&#xff…

oracle11 处理器数,11G AWR中%Total CPU与%Busy CPU指标的疑问

ODM FINDING:FROM http://www.os2ora.com/how-to-analyze-awr-report-1/ 推荐 kaya 的这篇文章引用如下&#xff1a;如果关注数据库的性能&#xff0c;那么当拿到一份AWR报告的时候&#xff0c;最想知道的第一件事情可能就是系统资源的利用情况了&#xff0c;而首当其冲的&am…

【OpenCV 例程200篇】237. 基于主成分提取的方向校正(OpenCV)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】237. 基于主成分提取的方向校正&#xff08;OpenCV&#xff09; 主成分分析&#xff08;Principal Components Analysis&#xff0c;PCA&#xff09;是一种基于统计的数据降维方法&#xff0c;又称主…

Java中12个原子操作类

Java 从 JDK 1.5 开始提供了 java.util.concurrent.atomic 包&#xff08;以下简称Atomic包&#xff09;&#xff0c;这个包中的 原子操作类 提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。 因为变量的类型有很多种&#xff0c;所以在 Atomic 包里一共提供了 …

swoole 捕捉php错误,swoole怎么处理错误

在协程编程中可直接使用try/catch处理异常。但必须在协程内捕获&#xff0c;不得跨协程捕获异常。不仅是应用层throw的Exception&#xff0c;底层的一些错误也是可以被捕获的&#xff0c;如function、class、method不存在下面的代码中&#xff0c;try/catch和throw在不同的协程…

【OpenCV 例程200篇】235. 特征提取之主成分分析(sklearn)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】235. 特征提取之主成分分析&#xff08;sklearn&#xff09; 特征提取是指从原始特征中通过数学变换得到一组新的特征&#xff0c;以降低特征维数&#xff0c;消除相关性&#xff0c;减少无用信息…

Linux 进程资源分配,linux 进程管理和内存分配

1、进程相关概念进程&#xff1a;正在运行中的程序内核功用&#xff1a;进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等Process&#xff1a;运行中的程序的一个副本&#xff0c;是被载入内存的一个指令集合进程 ID(Process ID&#xff0c;PID)号码被用来标记各…

【OpenCV 例程300篇】234. 特征提取之主成分分析(PCA)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程300篇】234. 特征提取之主成分分析&#xff08;PCA&#xff09; 5.1 特征提取的方法 初步获取的图像特征维数通常很大&#xff0c;而且往往包含一定的无关或冗余特征。特征提取是指从原始特征中通过数学变…