00:00
我们来用。原型模式,对传统的方式进行一个改进,那首先呢,我们来介绍一下。原型模式它的基本概念。原型模式呢,也叫pro prototype。Prototype模式。它是指。用原型实例,就是他用一个原型的实例,就是你认为的最初的这个实例,指定创建对象的类型这个种类,并且通过拷贝这些原型创建新的对象。也就是说,自我复制。那么原型模式呢?它是一种创建型的设计模式,允许一个对象在创建另外一个可定制的对象,无需知道创建的细节。OK,那么它的工作原理是怎么样子的呢?它是通过一个原型对象传给那个要发动。就是发起创建的这个对象。
01:02
这个要发起创建的对象通过请求原型对象的拷贝。啊,就是请求原型对象拷贝,他们自己来实施创建,其实简单的一句话就是对象点克隆。就是用这种方法来实现自我的。一个拷贝,那么形象的理解呢,可以这样理解,就是孙悟空。拔出了一根啊,拔出了几根猴毛,然后一吹,它就可以复制出来多个自己。啊,从属性来说都跟他一样。就是这么一种理解,就是原型模式。那原型模式它的一个类图长什么样子呢?我们来看一下它的基本类图是这样子的。Prototype就是原型对象。这叫圆形内。那么这个是concrete。Prototype这个是什么呢?这个就是具体的原型类,它具体的原型类可以有多个。
02:03
那这个呢,就是我们客户端,它去使用我们的这一个原型对象,那现在呢,我们把这个结构图做一个简单的说明来说一下啊,来走一个proto。Prototype。它是什么呢?它是我们的圆形内。原型内声明,他要声明什么呀,他要声明一个克隆,克隆自己的。自己的一个接口。OK,那我们再来看第二个,同学们看到的第二个就是抗。Concrete prototype。那这个是干什么呢?OK,这是一个具体的原型类。具体的原型。圆形内。具体的一个原型的实现什么呢?它实现一个克隆自己的什么呀操作。
03:05
他要实现一个克隆自己的操作。另外这个。就是同学们看到的这个这个类干什么呢?它是这样子的,它是。让一个圆形对象。让一个原型对象干什么呢?克隆自己。克隆自己啊,从而从而创建创建一个新的对象,属性一样的属性一样。啊,就是对这个原型结构图或者圆形类图,我们做了一个介绍。那有了这样一个原型模式的基本概念以后呢,我们就来玩一把。我们用原型模式来解决克隆羊的这个问题。那么同学们,我们来看看怎么改进,打开我们的eclipse,我们就在这上面改好来,在prototype这个包包下面呢,我们新建一个包叫improve改进。
04:06
点。Improve。好,这个羊还是这只羊。但是我要对它做一个相应的修改,那我怎么修改呢?同学们可以看到,首先。我要让这个ships。一个圆形,这个圆形内在这里呢,体现出就是一个接口crown table。这个crown c里面呢,它有一个方法,我们把它重写一下就可以了。出现哪一个方法,同学们可以看到它有一个叫克隆的方法。克隆这个方法来克隆。C。啊,克隆这个方法我们重写,这个方法是从哪来的,我们先来看一下。就是这个克隆这个方法呢,它是从哪来的,我们往上追。
05:02
森林。好点一下,我们进到这里面去。点注意一下啊。他在这个object里面去看一下。同学们看,在object里面,它有一个克隆方法。就是这个方法是从object这边继承下来的。然后呢,我在这边要去重写这个克隆方法就可以了,那怎么重写呢?来同学们看一下,我在这里要这么去完成。来走,我把这个做一个注释,做一个注释就是克隆,克隆该实例。克隆盖里使用。我使用默认的克隆。克隆方法。各种方法来完成。也就是说目前呢,我我不对原有的属性进行一个别的处理,我就。你原先是什么属性,我就用什么属性来处理。
06:01
我用的是默认的克隆,那怎么写呢?因为你后面要返回的是一是一只羊,我就用个she,等于初始化为空。初始化为空,然后我踹一下。TRY,因为这里面在进行这个调用的时候呢,会有一个异常抛出,是不是它这已经写了这么一个异常那呃。抛出去嘛,抛出去,那我这也可以不用这个try catch。我也可以不用,那就这样写了,Super。把这个super。拿到。调用这个呢,他给。这个super点克隆就会返回一个对象实例,我拿到它。OK,拿到过这边返回的是一个object,因此呢,我要把它转成一个C。好,转成这个S过后,我这返回大家可以看到,最终我这返回个什么呢?我这返回一个S。
07:01
但是在克隆的时候有可能抛出一个。这样的异常,那这样这个异常呢,我为了能够看到这个信息,所以说我就不肉掉了,我怎么处理呢,我在这踹。我踹一下,踹到时呢,我如果发生有问题的话,我把这个信息打印出来。不要这样写system。对不对,我把e.get message。如果有什么错误信息我打出来,然后我把这句话。同学们看到,扔到踹这个块里面去就OK了。也就是说目前呢,我们克隆这个对象11我们用的是默认的方法。那有些同学老师,那将来这个克隆的方法,我们能不能不用,我们能不能做做些自己的处理呢,也是可以的。比如说我们在进行这个深拷贝的时候,那这个克隆方法呢,我们就叫做自己的一些。独特的处理。好了,那同学们看,现在这个代码就写完了。
08:00
那写完过后,同学们看看我们怎么来?来做这个这个写完这个克隆方法过后,客户端的调用会有什么变化吗?我们来看一下。那这个时候,因为呢,我已经。实现了这个C这个接口,同时呢,把这个克隆方法也写了,所以说我就可以实现这个原型模式的一个自我自我克隆了,那代码我就这样去写,同学们看。原先你这儿有一有一只羊叫汤姆,对不对?好,现在我要再获取一只羊呢,我就不需要像以前那样用六的方法,我直接克隆。我教这个方法,大家看she。我在调这个she的时候,我怎么去做呢,大家看在这个地方。这个这个shep啊,我们要不要写错了,是这个包包里面的SP。所以说我要把这个去掉,为什么呢?因为我用的是自己同一个包下面的C,这里面才有这个克隆方法。
09:05
然后我接收起来,接收的时候呢,大家可以看到我直接接收这样一个。接收到exce,然后我把它转一下就可以了。比如说现在我有。克隆到第二只羊。然后我把它的类型呢,进行一个强转。这就是用的克隆。克隆OK,我往下面呢,改一下345。同学们可以看到,这时我们在用圆形模式得到。一个对象实例的时候呢,我们直接调到克隆,没有再用六方法了。而这个克隆方法我们已经在羊里面写过了,怎么写的呢?就是调用的。默认的这个它它父类的克隆方法完成这个事,大家看这个克隆里面呢,它会自自己去把你当前这个对象的属性跟它一一对应并返回。
10:05
好,所以说这样子呢,处理起来就比较方便,然后我把这些信息打出来,我们看看对不对,好吧,我们看看对不对C。我们看C2的信息。那直接呢,输出C2。同样C3 C4c5,我们都来输出一把345。这边也是345。好,这里我输出一句话,我说用的是圆形模式,圆形。对原型模式完成这个对象的怎么样克隆?对象,呃,完成对象的一个创建吧。我们预习一把。那运行过后,我们可以看到这个时候呢,没有任何问题,对不对,烫膜易碎,易碎颜色是白色的。好,这样子呢,我们就用原型模式来解决了克隆羊的一个案例。
11:06
那这样呢,我们程序具有更高的这个效率和扩散性,为什么呢?原因很简单,就是因为如果我这个羊的信息发生了变化,比如他们二了,或者说我这个羊多了一个属性。多了一个属性,我下面自然就拥有了,你比如说我这样突然多了一个属性,我这边一改,大家看到比如我这里有一个private。Private OK,我多了一个怎怎样的属性呢?比如它有一个地址。他有一个产地,这是比如说我们这个羊默认来自蒙古。哦,叫蒙古羊。蒙古的,呃,或者新疆的吧。蒙古。蒙古羊。好,默认是这样子,那同学们可以看到。当我这加了这样一个信息过后呢,我这个端其实不需要做任何变化,因为这六的时候啊,呃,你虽然只传了三个信息,但是有一个树心是默认的,所以说它克隆的时候也会给你克隆回来。
12:12
克隆回来,当然你在输出这个信息的时候,那肯定要把他的地址输出来,你才能看到最新信息,对不对,所以说我把这个to string方法呢,再重新的改一下就可以了,来大家看一下。To作方法这边不是多了一个属性address吗?好,你看我就改了这么一点,改了完了之后我们再来调用这个克隆,调用这个方法我们可以看到就多了。一个属性叫。蒙古羊对不对,还是比较方便的好同学们,那这个原型模式解决克隆羊,我们先聊到这里。
我来说两句