00:01
传统方案呢,存在了一些问题,对,那现在呢,我们来看一下用想约模式怎么去解决这种问题。好,我们先来看一下响约模式的基本介绍,我这里总总结了四点,首先想约模式呢,它对应的英文叫fly wait pattern,那么也叫音量模式。也就是说同学们如果以后听到有人叫音量模式的,其实指的就是响源模式明白,那么它的核心思想是运用共享技术,有效的支持大量细度细力度的对象,也就是说有很多这个对象呢,它是可以共享的,那么我们可以怎么样,我们可以共享?达到一个共享,用想源模式来打造共享,那么它在哪些地方可以用得到呢?同学们可以看常用与系统底层的开发。你比如说它解决一个系统的性能问题,像数据库连接池,这这个大家同学们都用过,数据库连接池里面呢,都有创建好的连接对象,就说我这有个池子。
01:05
当我这里有个程序,比如说我这有个Java程序,我去访问数据库,比如说这是我的数据库,明白。好的,那这个数据功能,我们有种方式是直接这样去取。对吧,就说我们每每去操作一次数据库,我们就拿到一个链接去取,还有一种方式呢,我在这边已经产生了一些连接对象,理解在这个词里面,我已经产生了一些连接的对象,这个连接对象已经跟我们数据库已经形成了一个长连接。那我怎么办呢?OK,那我Java里面要去操作的时候,我直接就到这这个地方去取一个,取回来直接用它就完了,用完了我就放回去明白,所以说像这样子的话呢,我们就可以在数据库连接池里面使用到这种音量模式。好的,那呃,如果如果有我们就直接拿,如果没有我们就创建一个就完事了,对吧?还有响猿模式能够解决重复对象在内存中的浪费问题,当系统中有大量相似的对象需要缓冲池的时候,不需要,我们并不需要总是创建新的对象可以从缓冲池了,这样可以降低我们系统的内存,提高效率。这句话呢,大家可能一时半会理解不了,我举个例子大家就明白了,比如说我们在网络有一个棋盘。
02:24
打个比方,有一个棋盘。这个棋盘呢,有有一些有些棋子,比如这有棋子,这有棋子,这有棋子,OK,那现在假如我们这有十个用户,比如说AB。呃,C有三个用户吧,他们呢,都要去看这个企业。或者是去下这个棋,大家想一想,那么我们这有ABC3个用户去看这个网络的这个围棋,或者是五子棋,那你想。A用户。B用户C用户,如果他们都去看这个棋的话,你有一种处理方案,就是什么呢?我给每一个人返回一个棋盘。
03:04
而每个棋盘的这个棋子怎么样呢,都是怎么样,都是不同的,那你相当于说创建了三个棋盘。那假设我们每个棋盘有100颗棋子,那就是要创建三乘以100个棋子,这样是不是很浪费呀?如果说我们只有一个棋盘,当B用户去看的时候,我们给他返回的时候,直接从我们这一个已经有的这个缓冲池里面去拿到这个棋子给他返回去不就完了吗?这样我们其实就可以大量的降低这种重复对象的创建明白。也就是说看起来是就是说ABC他们看到是都看到自己看到一个棋盘,但是这个棋盘是共享的,里面的棋子也是共享的,明白好,这样子就是一种想猿模式的经典使用,那响猿模式今年的应用场景呢,有实际数像string。字符,呃,数据库,连接池,缓冲池都是选元模式的应用,那同学我们在这里我看一张图理解一下,同学们在Java里面呢,都应该用过字符串,同学们可以看到。
04:08
学过Java的语言学过Java语言的同学都知道,如果我这里有一句话叫S等于hello,那么这个S它就会指向我们常量池的一个数据空间,是这样一条线过来了。OK啊,然后这个时候呢,你再用六的方式去创建一个相同内容的字符串,比如说也是哈。那么这个地方想一想,因为你用的是哈字符串,我也的用的也是哈字符串,如果我在这个长量池里面再去创建一个哈,这样就不值当了。是不是,那那你可能我这个程序里面还有地方还要用hello,你再去创建一个hello,这不是重复了吗?你看他是怎么做的呢,在我们JDK里面,它是这样做的,他让因为你16的方式嘛,所以说这个引用呢,仍仍然仍然指向我们这个堆的一个空间明白。
05:03
在这个堆空间里面呢,它在这个地方写上你这个字符串在常量池的地址,比如说这里面是0X11也指向这里。大家可以看到这样子呢。我们的S和S1。S和S1,那么这个时候其实他们指向的密使的是同一半地址空间,那这样就达到了什么?达到了一个想圆的效果,就想就共享,圆就是对象,你可以这样理解,想就是共享。而圆呢,就可以理解是对象,其实就是我们所说的共享对象的模式,明白其实这个应该很好理解,是不是好同学们,那有了这样一个想约模式的基本概念以后呢,各位同学,我们来给大家深入一下,我们画出想约模式的原理类图。同学们看。想圆模式的原理类图呢比较简单。首先我们可以看出来,他这里呢,一共会出现三四个角色,四个角色,其中这个角色是就是这个同学们看到这个角色on share的concrete fly weight,这个呢是有可能在我们小猿模式里面看不到的,有的这个可能是看不到的,明白好,那么我们来分析他的这个角色,第一个呢叫flywe,这是个抽象类,一般来讲它是一个抽象类。
06:22
里面呢,会有自己的一些抽象方法,而下面这个concrete Fla呢,是一个实现了我们flight weight的一个具体的指类。这里面呢,就会实现具体操作。OK,因为我可以根据你客户不同呢,返回不同的这个concrete,只是它的属性有变化。OK,那这边是什么呢?同学们可以看到是we factory是个工厂,他呢会根据用户的需求,从这个工厂里面去取你要的一个这样的一个实例,如果有,如果已经有这样的实例,我直接从工厂里面去取,这里面肯定会有一个集合,就在这个工厂里面肯定会有一个集合,明白这个集合其实就充当了一个缓冲池的效果。
07:05
这样的大家能听懂吗?当我们客户端从这个。从这一个bay里面去获取一个这样的实例的时候,如果在这个缓冲池里面有的话呢,就去,如果没有就创建一个。这样就达到共享好了,这样说呢,大家可能还是有点不明白,同学们,我呢,用文字再给同学们描述一遍,来说一说这里面的几个角色。首先我们来看一下flight,跟上我的思路,Fla。这个是一个什么,是个抽象。诶,啊,抽象。抽象的什么呢?抽象的想元角色,想元角色OK,就这个角色。那他是干什么的呢?OK,他是注意听讲啊,他是我们产品的抽象类。
08:01
什么意思?就是说你下面可能有各种不同的这个具体的时间类,它是个抽象的,他把一些共有的部分提到这里来,说它是产品的抽象类,那么同时呢,OK,同时它会定义出,定义出什么对象的外部对象,注意听外部对象和内部状态,呃,又叫。应该叫外部状态啊,外部状态和什么呢?外部状态和我们的内部状态。问题来了,那有些同学就问了,说老师这个你你这所说的,你你这儿所说的这一个外部状态和内部状态是什么,待会儿我们再聊好一会我会解释的,我写到这里,一后面解释。后面后面解释不着急啊,大家先听到,也就是说我们在这一个抽象类里边,或者说在这个想圆模式里面呢,我们要把这个产品的外部对象。
09:04
还有他的一个内部啊,外部状态和内部状态要把它找出来,简单说一下,所谓外部状态呢,就是频繁变化的,就是每个对象都不一样的,而内部状态呢,是比较稳定的,这个状态相对比较少。你比如说我们下棋,下棋子,我们棋子的位置就是外部状态,而棋子的颜色就是,呃,棋子的颜色就是内部状态,因为我们下五子棋也好,下围棋也好,状颜色其实就是白色和黑色是不是好,内部状态是相对比较稳定的。好,那么它是它同时要定义出对象的内部状态和外部状态的什么呢?OK,它的一个接口,接口,就它的接口就是我们的方法吗?接口或者。或者什么样实现?那如果是实现的话呢,呃,这个抽象类里面也也是可以的,对吧。
10:01
好,第二点我们来看一下,就是同学们看到的这个东西。Concrete。Concrete什么呀,这个。那这个东西它是什么呢?是具体的想模式,这些想元想园的角色了,就是具体的想元角色是什么呢?是具体的产品类。啊,具体的产品类就是它是具体的产品类了,已经,那一般来讲,他为什么他会实现抽象,就是前面我们的抽象角色干什么呀,定义的相关业务。你理解了吧,就说你是上面定的一些方法也好,还是你定的一些这个属性也好,到时间我们在这个地方就会有实现的操作,就是具体的了。OK,那么我们再来看第三一个,就是同学们看到的onhold。对不对,怎么看这个concrete。
11:02
什么呀,这个名字有点长哈。就说on concrete这个是干什么呢,它是不。不可,不可供供。想的什么角色?那这个角色呢,一般可能是这个角色啊,他可能会出现在想园模式中,但是他不会出现在园工厂中,这个就是我们想园工厂,我还没说啊,一会儿就会说这个呢,它一般来讲哈,一般不会出现在哪里呢,这个想园工厂。就是这个类里面它不会出现,就是再再画一下,就这个地方一般不会出现,就是说我们会把这一个共享的部分放在这个flight with battery获取就行了,首先这个不共享的呢,一般就不会出现在这里,好第四一点,最后一点,同学们看到的,同学们看到这个flightwe,这个很重要,Flightwe。什么呀?Bay,这个显然是个工厂,它是什么?它就是我们所说的想园工厂。
12:05
工厂类,那这个小圆工程类它要干什么呢?OK,它用于朱婷,它用于构建一个磁的容器。诶,那这样有词的容器是不是它里面至少有集合呀,有也也就说这个词呢,它是以集合的形式来展现的,待会同学们举案例的时候,一目而了然,然后他这个里面有个词容器干什么呢?OK,同时他还要提供从这个什么呢?OK,从这个池中。池中干什么呀?获取对象的相关方法。这就是一个介绍,也就是说同学们可以看到我们这里面呢,会用到的,在这个小猿模式会出现的四个角色就出来了,这是抽象的,具体实现的。具体时间这个是共享的部分,这个是不共享的,然后呢,这边是一个工厂,这个工厂里面会有个词,这个词呢是以集合形式出来,那么客户端我就不聊了,客户端就是用我们这个工厂去获取我们的相关的这个concrete,或者是on share concre1一般来讲是获取的这个。
13:12
OK啊,好,同学们,那现在这个响乐模式的基本原理,我相信同学们大致明白了,大致明白功能,我现在要给大家解释一下什么叫做外部状态和内部状态,来聊两句。那么在想约模式里面,他提出了要求,就是有一个细细力度和这个共享对象的问题,这里就涉及到一个内部状态和外部状态的概念。我举个例子。我举个例子,大家明白了,也就是说我们在做想约模式的时候,必须你要把它的内部状态和外外部状态分析出来。你分析不出来,那你这个响猿模式就不对,我举个例子大家看,比如说围棋,五子棋,跳棋。这些棋大家可能都玩过,那那这些棋里面有大量的棋子,对象棋子儿明白,围棋五子棋只有黑色和白色两种,这个没问题吧。
14:02
肯定就黑色和白色,跳棋呢,颜色多一点,所以棋子的颜色,这个棋子的颜色就是棋子内部状态。你跳起不是也也就那么五六种嘛,对不对,而这个颜色呢,它相对来说是比较稳定的,所以说它就是内部状态,而各个棋子之间的差别,最主要的是在位置上的不同,因此我们落子的时候,落子的颜色是定的,但位置是变化的,所以说棋子的坐标就是外部状态,分析出来没有就说什么呀,颜色是内部状态,相对稳定也比较少,而它的坐标是外部状态,每个棋子都不一样。所以说这个能共享的部分显然就是。我们这个颜色而不能共享的就是我们的什么呀,这个就是我们所说的外这个,这个叫做起止的坐标不一样,好了,这边我就再整理一句话,内部状态指的是。指对象共享出来的信息存储在想源对象内部,并且不随环境变化而变化的,而外部状态呢,是对象依赖的一个标记,这个是谁环境改变而改变的,是不不可共享的,因为每个棋子的位置都不一样,你怎么共享吗?
15:16
好,举一个例子,再举一个例子,那么比如说我们在网上有看这个网络围棋这个游戏,你会怎么设计?理论上说他有361个空位置,可以存放棋子,每个棋子都有可能有两三百个棋子对应对象产生,因为内存空间有限,一台服务器很难支撑多个玩家玩游戏,比如说现在呢,我要玩游戏,我有多少个玩家呢?比如说有四个玩家啊,比如说两个一组嘛,打个比方,这两个是一组,这两个是一组啊,当然一般来讲可能是两个玩家,更多的是观观看者是不是。就说有两个人在玩,有1000个人在观看这个网络游戏,有有没有这种可能性,有吧,就是我举办有这个围棋大赛,有两个高手正在玩游戏,下面呢,有1万个观众正在观看这个游戏,有1万个观众正在观看这个游戏,好,那你想一想,如果说我们每一个人都产生这个361个这个棋子,或者是两三百个棋子,那一台服务器就很难支撑更多的玩家来玩了,或者来来看,那如果用想约模式来处理的话呢,大家想这个就简单了,多简单呢,简单成这个样子了,起止对象就可以检测到两个实例,一个黑,一个白。
16:32
一个黑一个白,这样呢,位置不一样,我们再把位置分析出来,就说只是只是它的位置不一样,共享的呢,我们可以共享它的颜色有两个一黑一白完事,那么呃,位置呢,我们是做成外部状态不共享,这样就可以很好的解决对象开销问题,至少我们解决了很多实例对象是吧,其实就是两个,然后呢,对位置不一样而已。位置不一样而已,好了,这就是我们所说的这样一个我们能共享的部分就是内部状态,不能共享的就是外部状态,就这意思,好,同学们现在有了这样基本分析以后呢,同学们,现在我们就来开始给大家怎么样完成。
17:13
用这个想约模式来解决前面提出的这一个网站展示项目,用户给的需求不一样的问题,比如说现在有些人以新闻的方式,有博客的方式,有微信公众号的形式来发布,我们用想约模式来给他解决一下,好这个具体解决方案,我们下一个视频讲解。
我来说两句