00:02
祥源模式解决网站展现这个项目,我们来看一下怎么解决。那刚才的需求咱们已经说清楚了,对不对,就说使用想约模式来完成前面提出的网站外包这样一个问题。那还是我们的老规矩,我们呢先画出这个对应的类图,把这个类图画出来过后,我们用代码来实现,大家一下就明白响猿模式它是怎么来实现的,来打开我们的eclipse。那在这里呢,我们新建一个包。对吧,我们新建一个包来取个名字。那这个名字呢?我们叫响猿模式,叫FLY。没问题吧,同学们,FLY。那现在呢,我们来做这样一个类图,画出这样一个类图,大家一目了然。往下走,Finish。那根据刚才我们的分析呢,大家想一想,哪一个各位你们觉得哪一个是我们的这一个抽象类,就是前面那四个角色,哪一个是我们的工厂类。
01:07
好,我们先来一步步的画,首先呢,我们先画出它的这个抽象类。我觉得应该是web site。就是因为你这个客户需求不一样,所以说呢,这个网站也不一样,因此呢,这个我们做成一个抽象类,它这里面肯定会有一个最基本的方法,就叫use使用。是不是我们假定他有一个使用我们这个网站的方法,这个方法呢,到时也做成抽象方法没问题吧。好,这是一个。呃,这个我们的网站抽象类,那下面它会有具体的实现子类,那这个子类呢,我们叫concrete。Concrete web site。是不是同学们好这样子呢?我们就让他继承汁就可以了。思路很清晰。那同样你要继承他,肯定要去实现这个优势方法,这是肯定的。
02:03
没有问题,肯定要用到我们的us。好的,那有了这个东西以后呢,同学们看我们是不是还有一个工厂类啊。工厂内我们就划到这边吧,好吧,比如说这个是web。Web site。就是你要用这个网站,我们从这个factory里面取一个就可以了。好,我们把这个思路往里面画一画,那他们之间是一个什么关系呢?就是web和web什么关系,刚才讲了这个web里面它会有这个集合的,也就是说在这里面呢,会出现一个词,所以他这里面必须要给我们提供相关的方法,比如说这里面最核心的两个方法哪两个,一个是get。Get我们的这个we,就是我要从那边取一个we嘛,所以说get web的一个分类,就是你是要哪种类型的网站。
03:02
因为我们是根据你的类型不同,你是网站形网以新闻形式发布,还是以产品形式发布,还是以这个微博客形式发发布,OK,我们从这里面给你取好,那既然如此,那么我因为这里面还还有词,所以它里面会有个集合,既然有集合,肯定我们会把we干什么呀,聚合到我们这里面去,是不是,所以说这要画一个聚合。明白,好,这样写完了,过后我们还有一个client。客户端要去用它来各位同学我们写。那同学们聊聊,想想这个问题,Connect他会用到谁呀?他显然会去使用到we,因为他从we里面取一个website,他要从we bay里面取一个网站吗?只是你的分类不一样而已。同样他还会用到它。是不是好,那这里面只主要是分类不同。他们都是一个具体的website,你是以网站形式的,我就返回网网站形式,呃,网站形式,你要是以博客形式的,就博客形式,好,这样就是一个最基本的案例,那么就说出来了。
04:06
大家看能否理解好,那现在呢,我们用代码给各位朋友走一下,看看我们从代码的层面来实现它会怎么来完成,我们按顺序来写,首先呢,我们先写第一个类。就是哪一个根据我们刚才写类图的这个顺序来走哈,我们就写写we。这个没问题。好,走一个,这显然是一个抽象类,根据我们前面的分析,它是一个抽象类来走一个,就是abstract。OK,那这里面我们刚才讲了有一个抽象方法,就是又是OB。对,Abstract,然后对面有个VO use。完事,这个方法就写完了,这是个抽象方法。好的,那这个方法整完了以后呢,我们接着往下走,下面呢,我们来写它的这个。
05:02
Concrete一个具体的。一个时限之内,OK,那写一个。来写新的一个类。对吧,这个内容我们叫做coner什么呀。OK,往下走。那这时候我们让他干什么呢?显然他是要去继承我们刚才写的这一个website。这个没问题吧,同学们就说我这有个具体的指类,我要去实现它,实现了我肯定要把这个类型在这指定了,比如说你这个网站到底是什么类型,我在这写。是什么形式的,对不对?String,比如说我们写一个type吧,就是它的一个类型。等于默认为空,这个我们认为是网站发布的形式。啊,或者叫类型都可以。发布形式或叫利息。OK,那这个整完了以后呢,下边我们应该做什么呢?下边是不是我们来实现它的那个use方法,这个很简单,我们把use方法形式。
06:09
那这边我们加一句话就可以了,来走一句话,这句话我们应该怎么写呢?我们有网站。的发布形式为为什么呀,把我们这个type输出即可。那想你这有这个方法过后,还有一个构造器,你得写一个吧,就是你得有个构造器,这个构造器把这个你得把这个type传进来呀,你也就说你在创建一个具体的这个子类时候,对吧,这是具体的网站。那么你你要创建一个具体的网站,你得把这个type给传进来,因此呢,我这需要一个什么呀,同学们,我这里需要一个。构造器。把大夫传进那就就完了,就这么一句话就完了,这是他的构造器。没问题,好,这就写完。那写完以后我们接着往下继续来玩,下面应该写哪个呢?根据我们前面的类图,我们应该写we factory,这是关键。说了这里面会有一个集合,这个集合充当词的作用,来玩一把。
07:11
打开。我们新建一个,新建一个来走,新建一个类,这个类的名字我们就叫,刚才叫做VI什么呀,Y没问题吧。好,那这个类有了功,我们下面呢就来编写一下它代码,我们写成叫做。叫做什么呀,工厂。这个叫网站工厂类。工程类干什么呢?根据需求。根据这个需求返回,返回一个什么呀,这个网站。当然是个具体的网站了,那同样我们来写一把,首先呢,它有一个集合,这个集合呢,充当刚才分析了充当什么呀词的作用。非常的简单,来写个private,那这边我们就简单用用用哈希map来走就行了,首先要把这个网站类型告诉我,然后下面呢有个具体的网站concrete。
08:09
Concrete con。Coner coner是吧,Concer什么呀,我们刚才是。好的,那现在呢,有个词我们就叫pull,等于六一个哈希map。哈希map完事。OK,好,这就OK了,那我们把相关的包移一下。OK,好,接着接着往下走,往下走,下面呢,我们要干什么呀,根据朱婷,根据你需要的类型,根据类型注意听,根据网站网站的这个类型,或者要发布形式返回,返回什么呢?返回一个网站。如果没有,如果没有就干什么呢,就创建。
09:03
一个网站并放入到并放入到池中,诶同学们,前面我们是不是分析过这个这个方式啊,就是我们像这个数据池。是不是也这样干的?呃,数据库连接池,我先从这个池里面去拿,如果有我就返回,如果没有怎么样返就给创建一个放入到池中并返回。是不是这样子,好,我就写了,那就public,它要返回的是一个website。它返回web,所以我写个方法叫get y本。We。对不对,Get website,那么前面呢,我们写上,根据前面写的叫get we cut。它的一个类型。同时就是把这个类型就返回去了。Category。Category,好,你把这个什么呢?类型传给我就可以了,Type。好的,那你有这样一个东西过后,我怎么做呢?我是这样写的,大家看,首先我判断一下这个词里面有没有是不是我用。
10:09
EST k,如果说这个type在这个词里面是没有的。我这样先写啊,如果没有,如果没有干什么,我就创建一个。并放入池中。这个对我来说很简单是不是,那就怎么说呢,破。点put,把这个type放进去,OK,值显然就是六一个了。又一个concrete。Concrete website好类型放进去即可。这件事放完了,过后不要着急return谁呀,Return我们这个。点get我们这一个type。当然这个类型我们要转一下,因为你这返回来的时候呢,你你要以这一个we的形式返回,为什么?因为你下面子类嘛,你下面这个子类上说我把它转成website,这样利于我们的这个这个管理好,这样就返回了。
11:05
还有一个方法就是。我们既然要做呢,我们还要写一个方法啊,假如我现在写了一个什么叫获取,获取我们这个网站网站分类的一个总数。其实这个呢,就是为了待会验证一下啊,验证一下public,就是看看我们市面或者叫池中。我叫词中有多少个实际的网站了?网站类型好,那现在我们就返回它就行了,Get web site count很简单,大家都知道从我们哈希map里面去返回一个它的数量是不是很简单,就用我们的po点什么呀下即可。代码就写完,也就是现在呢,我们把那个也写完了。把这块写完了,现在我们来用C进行一个简单的测试。朋友们写一个client测。
12:02
那怎么怎么测呢。把主方法勾上,我们这样来进行一个简单的测试。首先呢,我们先去创建一个工厂内创建一个工厂。因为我们要从这面获取嘛,那就溜一个web side battery没问题,好拿到了,拿到这个工厂以后我们就来,假如现在客户有这么需求啊,比如说客户。要要一个以新闻形式,新闻形式发布的。发布的网站。我们。怎么个产生呢?非常简单,就用这个。我们这简写成factory吧,别写这么长了。因为大家都知道这是web,返回web的点,我get一个,我把类型放进去就叫新闻。拿到了啊,同学们。拿到好。这个时候假设是我们的WEB1。
13:00
没问题吧,这是我们的第一个网站。拿到了,拿到功能我们use一下,我们看看这个网站现在能不能用了点use,我们运行一把,同学们可以看到现在运行的这个结果哈。愿意这个结果。他说,网站发布的形式为新闻,现在使用了。正在使用,因为我这已经拿到了。或者说这把这句话再说的具体中。我们发布形式为这个网站在使用。在使用中。问题吧,我们再来运行一把,这样呢,提示的信息更清晰一点。好,同学们可以看到A在使用的,那像现在假如说假如说我们现在有一个客户呢,他还要以一个要一个什么呢,以这个。呃,博客形式发布的网站好,你看我怎么写,他要以一个博客形式发布的网站,我们这复制一份就可以好。博客形式。博客。啊,博客。然后呢,这边我们把它改成博客,我要一个博客形式的网站。
14:04
假设这是第二个用户来了,他要这个好的,我们把这个代码稍微的整理一下,然后运行一把。我们可以看到以博客形式使用了,诶下面假设又来一个客户了,这个客户呢,他也想要一个以博客形式发布的,OK,我们再拿一个第三一个再来使用。好,假如说还有一个客户,他还要以哪一个以博客形式的啊,就是第四个。又使用它。朋友们,我们格式化一下,我们在运行着,我们发现呢,每个人都拿到了,但实际上我们一共有,实际上一共产生了几个几个实例呢?来我们看一下。OK,走一个,我们写到这里好,就是网站。网站的分类。共。共多少个呢?诶,共。等于加上我们这个website。
15:02
点get他的一,诶不是get啊呃,那个方法应该是是从工厂里面去获取,对不对,Bay看看我们这个工厂里面到底创建了多少个网站呢。来我们运行,其实我们发现只有两个。是不是只有两个,也就是说如果说你的形式是相同的。你要博客形式的,我就按博客形式给你返回一个网站,你要的是新闻形式的,我按新闻形式返返回,那这样子呢,我们就比较easy了。比较easy,好,关于这个方式呢,我们就先说到这,但是有没有发现我们这边是有一个问题的,大家有没有发现在我们这个里边,我们把这个类型啊。就是把这个类型写出,哎,在这在这里是不是一个类型,这个类型其实就是我们所说的共享。这个就是我们共享的部分。共享的部分是不是这样子的,那么共享的部分从我们这一个想源模式来看,它其实属于内部状态。
16:04
是不是属于内部状态的?没问题吧,但是大家想一想,目前在我们这个网站里面有外部状态吗?显然也应该是有的,你看有现在我们没有写呀,你你看这里我们使用的时候,你体现出来是谁在使用了吗?说。新闻网站正在使用中,博客在使用中,这个也在使用,这是那我问大家,你每个网站的用户肯定是不一样的。所以说你在这个设计模式里面,其实还少了一样东西,就是它的什么呀,外部状态你没有分析出来,所以这个分析呢还有问题。那么同学们想一想,此时此刻我们还有一个什么东西没出来,就是用户不一样,因此在这里面我们还得加一个东西来看一下。小周来。User。是不是应该还有一个userr啊,这个userr其实就是我们所说的外部状态,因为你把内部状态这个type已经写到这里面去了,UR你没有用,所以说其实在这里面呢,我们还需要一个user。
17:07
就是他会用到这个user。User的时候,你是哪个userr用啊,里面是不是也要创建一个userr啊,因此这个就是我们说的外部状态要分析出来,于是上面这个代码我们要怎么样改进一把这个userr。是什么呢?外部是我们共享圆模式,享元模式中的。什么呀?什么呀,就是我们的外部状态。这要分析出来,我们要把它加进去。好,同学们,我把这个呢也给大家连到这里,好,我们把它加进去。来,用一根线连起来。非常的简单,我们加进加进去完了来,就在这稍微改进一把。找一个USR。走一个优。好的,你看我怎么把它整进去哈,首先既然你是个user,肯定它是一个相对独立的,那我就写个private是哪个用户user名字是dream。
18:04
使君。是吧,你是哪一个用户,然后给他生成一个set和get方法就可以了,而。Set get,好的,那大家想这个user根据刚才分析谁要用到。Concrete concrete we用到,那于是乎我们把这个代码打开,那哪里用呢?显然是在这we里面。Web下列也要用到,就是。有。是不是user user好在这一个concrete里面呢,我们这个方法也要重写了。就是谁在用。他有外部的信息,于是网站的发布形式是这个谁在使用呢,加上。对,加个空格,加个空格谁在使用用户为,呃,这样子我们简单一点哈。要写字,所以在后面把这个用户名写了使用者为,使用者是。
19:02
哪一个呢?把他名字说出来就可以有点盖的name。完事。好,这样子就就完事了,那这样子做完了以后,同学们可以看到在可耐的手机用的时候,是不是我们在用的时候,要指定是谁在使用,这个就是外部状态,那么我们来创建一个UR一个。261个user对吧,点set一个名字进去就可以了,比如说这是哪一个用户呢?是我们的新浪或者是。啊,汤姆吧,比如说汤姆这个人。好,这是汤姆在使用这个新闻网站,新闻形式发布的网站,还有我们再来一个用户。这一帮不要打,先打的。再来一个用户。比如说这有一个用户,这个用户是Jack。Jackie。好,我们保存一下啊。癌症是什么问题?Website。OK,这个地方。他说web是个无效的,我们看看。
20:02
WHYS?Web设置里面有了。好,我们把它单独的提出来吧,看看是不是这个原因哈,User嘛,这一方你不能这样去调了,你把把名字写进去,那就不合理了,那这样写,我们这边创建一个user。对吧。嗯,看看怎样用更合理,怎么把这个用户创放进去就行了。呃,要不这样子吧,这个user里面呢,除了有get,有个set,我们再写一个构造,构造方法,这样简单一点好。好,把这个名字直接放进去,这样就简单了。来这样写,这边呢,我们这样写就行了,六一个user,诶这样简单对不对,User用户来了再来,这个是我们的Jack用户。Jack。这边是我们的另外一个用户,比如是史密斯。史密斯这个用户,再用博客形式的,再来一个用户,比如说这个用户呢,是king。好,我们来运行一把。
21:02
那运行过后我们看一下这个效果,同学们看到可以看到,他说新闻是汤姆在使用博客,Jack使用的是史密斯king那。尽管你有四个人在使用,但实际上我们网站分类是两个。好,同学们,这个就是我们的一个经典的。就是所说的。音量模式或者叫做想圆模式的一个案例,大家看理解了没有,其实它的核心主要是体现在哪里呢?就说我们能够把外部状态和内部状态分享。把它喷开。分开过后呢,我们在提供的时候能够共享的部分。都拿用,所以说你看我们实际上。我们实际上用的时候,只有在这个类型不同的时候。只有在这个类型不同的时候,我们才会去创建一个实际的网站。如果类型相同。那么我们就共用,你用的是博客这样的网站,我也共用就行了,只是用使用者不一样,当然我这个使用者不一样,我的体验是用户名如果有其他不一样的,你把它单独拿出来。
22:04
也就是说说的再简单一点,就是同学们可以这样去分析,将来你把共用的部分全部写到这里面去,就是concrete website,然后呢,把外部需要使用的地方呢,你把它单独的给他做一下就行了。好,同学们。关于这一个想约模式的。来解决网站外包项目,就聊到这,当然这样讲呢,可能大家还是有点不明白对不对,没关系,待会呢,我们再找一个源码进行一个分析,大家理解的就更到位了。好,关于这一讲,我们就先聊到这里。
我来说两句