00:02
调节模式解决手机操作问题,前面我们用传统的方法来解决这个不同样式的不同品牌的手机的操作问题,是这样设计的,对不对?那这样设计呢,我们发现呢,如果我们要增加一种新的样式,或者说增加一个新的品牌的手机,这个维护性还有扩展性都不是特别好,于是乎呢,我们决定用桥接模式进行一个改进,那同学们来看一下,既然我们要用桥接模式来解决手机操作问题,我们首先还是按套路出牌,我们先画一个类图,帮助同学们理解,来吧,同学们来,现在呢,我们打开这里。打开这边我们新建一个包包。对,现在我们讲的是桥接模式,所以说我写个break。OK,小接模式。好的,那现在呢,我们就直接升代码了,首先我们画出。
01:02
这个类图。画出这个类图。好,我们在这写一下,那我们首先怎么整呢?先把根据前面那个讲解,首先我们要有个接口。那他想这个接口是谁来充当接口比较好呢?是不是实现者?就是你实现功能的。你你你你谁来实现这个功能,是不是手机来实现功能,所以说品牌做一个接口,这个品牌里面呢,我们会有他的一些方法,然后在下面呢,我们会有,呃,比如说这个品牌里面我们有一个call方法。靠打电话的方法,靠。跟上我的思路。OK,好,这是我们的一个品牌,是个接口,那下面我们有哪些品牌呢?那就是具体实现了,比如说我们有VIVO手机。VIVO。没吧,我们还有什么手机呢?我们还有小米手机。
02:01
小米。OK,那这个时候这一块就相当于是我们的具体的实现内,我们放这边吧。那实现的话呢,我们用这个线来连接没有问题吧,同学们。这是实现。这个类的层次,那紧接着呢,我们是不是应该有个抽象的类。对,一个抽象类,这个抽象类呢,我们就叫form手机。对手机就是这个手机呢,我们认为是一个抽象的,那下面折叠式的手机和直立式的手机样式,那么就是它具体的一个实现。那手机里面会有什么东西呢?显然手机里面我们会聚合这个接口,就是brand这个品牌。大家能否理解?当然类型就应该是brand了。BD好聚合进去。聚合进去算了吧,好聚合,那聚合完了过后呢,我们发现手机的样式就是具体的实现实现内了,那我们写上两类,一个是什么呢?是我们折叠式的for。
03:08
Phone。没问题吧?然后还有什么类呢?还有比如说我们还有直立式的,我就写个upright。RIGHT。Upright form。那么他们呢,就是我们这一个手机的具体时间内,所以说我们用它来进行一个泛化。泛化它。好,这是这样一个东西,然后我们还缺一个客户端来调用,所以说这边有client。那客户端我们调用的时候,我们怎么用呢?显然我们要用到手机。是不是要用到手机啊,肯定要用到手机,所以说我们依赖。依赖form,那当然你在用的时候通过这个phone就可以,其实是通过它的这个抽象类跟我们下面具体子类进行一个什么样进行一个依赖,同样这面我们可肯定还会用到brand,因为我我要给他,给他传一个这个具体的brand的,就是品牌的一个指类嘛,所以说这个还会用到它,如果说画严格的话呢,应该还会用到它,我们把这个挪到上面来。
04:13
是不是这样的一个关系啊。好,这样就可以了,那同学们可以看到这样子它的扩展性就会非常好,为什么说这样子扩展性会非常好呢?因为如果我们要去增加一个,比如说我们要增加一个新的样式,只需要在这加一个就可以了,其他不用动。啊,其他不用动,好同学们代码的一个类图的设计,我们已然做完,已然做完,那下面呢,我们就根据前面的这个分析,我们把代码给各位同学。实现一把实现一把好,首先呢,我们来看一下,我们先写哪一个呢?先写这个brand,按照我们顺序来走,好吧,同学们打开这里,我们写第一个brand品牌先拿出来。是个接口。BD brand。
05:01
那这个品牌它后面有具体的实现哪些方法是需要他实现的呢?好,Void,比如说我们有一个打电话的VO,就写一个void。Open。打开电话。开机哈,开机然后呢,Void close。关机,还有一个void什么呀,打电话call。是不是就可以了。也就是说这是一个接口。这是个接口。那接口下面呢,我们会有具体的实现这个接口的,呃,这这个这个类好,我们紧接着呢在写,刚才我们讲过这是品牌,品牌下面有几个品牌呢,现在我们有两。小米。OK,小米。那小米这个手机呢,我们让去实现它是一个小米本身它是一种品牌手机嘛,所以brand。OK,那现在我们把它打开。实现,比如我在这提示一句话叫做什么呢?我简单提示哈,就是小米手机开机了。
06:03
对吧,小米。小米手机开机。好,其他意思类推。下面这个是小米手机,怎么样关机?关机。那这边是小米手机打电话。小米手机打电话小米。手机打电话,打电话OK。好,这是小米手机对这个brand的接口的一个具体实现,那下面呢,我们还有一个手机,刚才说了是VIVO手机,是这样子吧,同学们,待会大家能够体会到这种设计模式的优越之处。好,下面呢,我们来implement,谁呀?还是brand,因为VIVO也是一种具体的品牌。把它呢粘过来没问题吧,好粘这那现在不是小米手机了,是谁呢?是VIVO。VIVO简写下面这个是什么呀?这是VIVO手机开机啊,就是关机了,VIVO手机关机。
07:05
下面这块呢,是VIVO手机怎么样打电话。VIVO。VIVO手机打电话。打电话。好的,那也就是说现在我这已经把什么实现了呢?就是把这这边实现就实现这一层实现的这个类的城市搞定了,现在我们需要写什么呀,我们需要写抽象这一层。那写中央内存呢,我们来这个手机里面就会把品牌给它组合进去,就是有手机样式,样式和品牌都在这个phone里面进行一个组合。那现在呢?我们来写一个类。OK啊。放呢,我们把它做成一个抽象的没问题吧,同学们做成一个抽象的。好,做成一个抽象的话呢,我们这边首先要组合品牌,把品牌给组合进来,品牌刚才我们讲了一个brand。
08:01
B brand没问题吧,同学们。那既然是。这个品牌我要我们放进去,我们在构造器的时候把它加进去没问题吧,同学们,那构造器呢,我们写个O。OK,也就是说你在创建。这一个phone的时候,我们把这个品牌就给它放进去了,This brand传进来的构造器写到上面去。好的,那这个做完了以后呢,我们来看呃,它的一些方法,那方法你开机关机是不是我通过这个brand就可以调用了呀,因为你你下面具体的子类实现了嘛,所以说我在这呢,写上它的一些相关的怎么样方法就可以了,Product,比如说我们保护一下protected void open。那在这个open的时候呢,我就不置机械,我去我用brand调用我的open,那到时间这个品牌是什么。就调用对应的那个品牌的手机的open,是这样的吗?同学们,那其他以此类推,Protected void close。
09:04
Close,好,这边是brand.close。没问题吧,同学们还有一个什么呀,Protected。Protected。对void什么呀。同样我们也是通过这个brand来调用,因为它是个接口嘛,调它的方法是没问题的,这个接口到线传进来肯定是个接口,具体的实现子类。的一个实例,好吧,OK,那这个就写完了,那也就是说现在我们这个这块写完,写完过后,是不是下面我们应该写他的样式了,诶我们是在这边写的,是不是还有样式啊,因为你这个手机是有样式和品牌一个组合嘛,所以下面呢,我用for phone和upright phone将它怎么样继承?没有吧,同学们,那现在我们先写一个类。这个类呢,我们先写一个叫。
10:00
Fold folded for没问题啊同学们,那这边呢,我们就把它写进去。来走一个,那写进去之后呢,我们需要他去干什么呀,继承。需要这个去继承我们的phone。是不是要继承他呀,那继承他的时候完了过后,我们这这边是是不是有些方法要去。进行一个处理,要去进行一个处理,呃,我们看一下fo phone呢,它这边会提示一个。啊,这个这个构造器至少咱们要写一下,要传进去嘛,所以说我先写个构造器,构造器,那构造器的话呢,老规矩按照刚才这个思路来整就行,诶这个构造器。呃,我们想一想这个构造线这样写哈,咱们自己手写一下public什么呢?For。对,然后这边我们要传进来一个brand。
11:03
Brand BD。那这个brand我们调用super,用它的构造器把它传,呃初始化,就是我在去初始化这个子类的时候,其实调调的是它的负类的这个隔噪器,把这个brand传进去了。好,下面的一系列方法咱们就可以照着一样写了,VO的open。对不对,那这个是open呢,我们首先调用它部类的super下面的这个open。对吧,诶这个地方叫open,写错了open,然后这边我们提示一下,现在打开的是哪个手机呢,也也可以这样写。这书必须写到前面啊,写到前面我们这写一下是折叠手机,因为现在是折叠的折叠手机。折叠样式的手机,折叠样式手机。是不是,诶就是说我们open的时候,我们首先告诉他我们是折叠手机,然后是把这个折叠手机打开就可以了。
12:03
是这样的吧,同学们,OK,那下面close方法是不是一样的道理?Close。Close。好close呢,这边调的也是它部类的。这个close。是不是这个道理,因为你类已经把这个close上面这个具体的这个写法,是不是已经已经进行一个调用了。那调用过后呢,下面我们接着再往下面写,下面还有一个public void的什么呀,Co。打电话这个方法,那打电话的时候呢,我们仍然调用super下上面这个call方法,然后这边提示一下,我们是折叠式的,呃折折叠样式手机。好,同学们,那这个。这个折叠样式的这个是这个fo fod的fo呢就去实现了,我们这个抽象的form,就是折叠式手机被实现了,就是折叠式手机。
13:07
的这个类。他实现了什么呢?哦,他继承了,他继承了我们这个抽象的类,哪个抽象类。Form,所以说这边呢,就这条线,就是我们抽象的。定义那边是我们具体的事情,因为你这里面真正干活,像这个open。像这个close,你看调用我们类。父类里面它是怎么调的,你看父类里面的确是有这个open的。但这个open其实它是真正让谁干的呢?让这个brand去open,而brand下面具体的时间内,是不是就是我们小米啊,或者是。呃,这个VIVO手机说真正干活已经到哪里去了,就是通过我们这个桥接,大家有有没有一种感受,什么感受呢?就这个模式,它在这个地方。调open。或者叫三跳,叫open。
14:00
他其实是找的负类的。Open大家看这个桥是怎么搭起来的,而这个类里面这个open呢,它其实是通过这个接口。去找到了VIVO里面的open。所以说你看其实这个地方就充当了一个桥的作用。是不是他具体其实他自己也没干,他只是通过你这儿组合的这一个接口,然后呢,找到这个接口的子类去调的他的方法,因此这个就是个桥的感觉。大家理解了吗?啊,当然这个你要理解,你还是好好的想一想啊,不是说设计模式,也不说老师说一句话你就马上理解了,但是这个图还是比较明显的展示出来,这个过程就这有个open。他调这个open,其实他他经过这一系列的,他调这个open的时候,他最终是找到哪去了呢?找到这个对应的,比如说折叠式,假设我们传进来品牌是VIVO,它就叫这里面的open。如果你传进来的这个折叠式是小米的这种折叠式啊,那调调的是小米的open,那他怎么过来呢?其实就是通过这个桥过来的。
15:04
而这个桥呢,主要是靠组合了一个brand的接口过来的,好,所以说这个桥在这这个桥接内就是缝。它它是个抽象类,同时也可也是个调节类,好这这样就写完了,那写完以后,现在我们可以可不可以试一下,我先暂时不写这个子类式的哈,因为待会我会让您感觉到我加一个指令是非常的轻松啊,轻松,现在我们先来用一用,看看折叠式手机对应的VIVO和小米是否已经可以用了,来各位朋友。我们现在呢,写一个client。OK啊,把主方法勾上,那在这里我们要去调用的话呢,也是非常轻松的一件事情,来玩一把。跟着老师思路。现在呢?首先我们获取这个折叠折叠式手机。那这个折叠式手机它一定是什么呀,一定是样式。
16:00
样式加品牌。就是在我们这个过程中,其实你你发现样式加品牌才是一个具体的手机,比如说VIVO VIVO呢,它是一个品牌,同时你还告诉我是折叠式的还是呃,折叠式的这样子吧,所以说我先溜一个溜一个for。首先是折叠式的,把什么品牌放进去呢?比如说华为啊,现在我们是小小米是吧,小米的放进去。OK,产生了,同学们看这个就是一个具体的手机了,那这个具体手机我们用phone来接收,为什么呀?呃,这个是一个PHONE1吧。因为你你这个fo fod的phone其实是phone的一个子类嘛,所以说我用负类的这这个变量来指向子类的一个实例是没问题的,那用完了过后,我们现在就可以用了FOR1。点什么呢?比如说open。啊,放一。点什么呢?打电话OK啊,然后换一。
17:01
点close,那这就写完了。写完了,那同学们看我们,我们这个就是说白了就是折叠式的小米手机,那么我们还可以再写一个折叠式的。啊,还这这个是折叠式的小米手机,我还可以写个折叠式的什么呀,折叠式的VIVO手机是不是也很轻松啊。我把它写成二,大家看一下。折叠式的VIVO手机,把它改一下就行了,其他你是不是不用该变化?就传进去VIVO是什么,它调的方法又发生变化了,好,我们来玩一把,现在呢,为了看到这个效果,好我在这打一个间隔符号。来各位朋友,运行时大盘运行你会发现代码跑起来了,看到没有。上面这个是小米手机开机它是折叠,折叠样式的小米手机,打电话是折叠样式的小米手机,关机是折叠样式,下面是小米手机。诶,怎么是小米手机呢。这是VIVO啊。
18:01
哦,不好意思,我调错了对吧,写没写错,调错了。把掉到上面那个,那就不对了。可以看到现在是VIVO手机开机了,这个VIVO手机是折叠样式的,VIVO手机打电话是折叠样式的,VIVO手机关机是折叠样式。可以。那大家有没有发现?我们我们这种方式,如果要去增加一种样式。我不管你。我不管你这个这个品牌有多少个。我我要增加一个样式,其实我只要写一个类就可以了。大家明白吗?呃,假如你原先有VIVO,小米,还有华为,有三三个品牌的手机了。其实我要增加一个样式,我只需要写一个就可以了,明白我的意思吗?你比如说现在我要增加一个直立,就是直板式的样式的手机,其实我写一个这样的抽象的一个就是就去实,就去记上一个phone就完事了。而VIVO就就就加一个就可以搞定,VIVO和小米自然就拥有了直立式的这种样式的手机的一个操作,明白我意思吧,那同学们我们来体验一下它的好处来,现在呢?
19:13
我们新建一个类,叫做upright。OK upright。Upperph phone,嗯,Upperone呢,我们让他去实现我们这个抽象类。是这样子吧,首先呢是form。大家看理解OK。那这个地方我们我们这个代码跟折叠式其实很像,所以说我可以复制一份。是不是可以复制一份,复制完了过后,同学们可以看到构造器,我们改一改。把它改成他,诶这边就。你你有没有发现哈,就就就已经好像就已经可以了。那当然这边要改一下,这个不是折叠式直立式的。直立。
20:00
诶,这个直立是直立是吗。直直,直接的直。直立立立起的立好直立式样式,直立样式,手机这边是直立样式,手机这边也提示他是直立样式,可以了,大家看我仅仅是增加了一个upright phone。这个。之类。他就拥有了小米。还有。那个VIVO22个手机的,呃,这个指令样式就对应两两个品牌手机了,大家理解吧,那你看我使用的时候就会非常的简单,你看我怎么写。好,现在呢,我们要去新建一个直立的。那这个时候我们建一个小米手机,那就就用了,就已经可以用了,对吧。就可以用了,小米好完事。对不对,小米完事,那这边呢,我们就可以写个FOR3。上。是吧?那同样道理了,如果你要去得到一个直立式的VIVO手机,VIVO手机,那就没有一个VIVO。
21:09
对不对。那又可以拿到了。下面呢是第四个手机。好,第四个手机代码就行了,你看你一下就搞定了,假设你原先原先这个品牌下面已经拥有了华为,还有苹果,你甚至还可以再用两个手机。所以说我们用写了一个类就可以把所有品牌的手机全部带进去了,那么我们来调一下。这样调一下啊,呃,同样道理,我们怎么调呢?放三。点open。放三。点我们的扣三。第二,我们的什么呀?是这样子吧,好,为了好看呢,我们进行一个间隔符号。是不是这样子,同学们,那同样我们还可以去调用分式。方案四呢,我为了省事,把这个粘贴复制一份。
22:04
可以看到它的变化是非常容易的,对吧,444OK,运行车那么运行,我们看一下这个效果出来了没有那么看。小米手机开机是直立式的,小米手机直立式的,小米手机关机直立式,下面这边VIVO手机开机是直立式,央视的VIVO手机,VIVO手机打电话是直立央式的。一样的好。同学们,我们通过这个小小的案例。还有通过这个类图,我们就可以非常明显的感感觉到它的这种价值是吧,一边是具体实现,一边是抽象定义,然后呢,用端把它关联起来或者依赖起来就可以了。好,同学们,那关于源代码的实现呢,我们就给大家讲到这里,大家看看能否理解。
我来说两句