00:01
策略模式的基本介绍我们说两点,策略模式呢,叫strategy pattern,它是定义算法的组,就是它定义一些算法,分别封装起来。让他们之间可以相互替换,哇,这个很有意思,它可以相互替换,你想要什么我就给你什么。此模式让算法的变化独立于使用算法的客户,怎么理解呢?就说这边是我们的要使用算法的类,这边是我们算法的具体实现,也就是说这边是使用者。可以说是类A类这边是算法。用什么呢?用接口的方式来完成,你如果需要好就给他就行了,就这么简单,就聚合到这边就可以了。所以这个思想还是非常好的,那这种算法,这这算法体现了几个设计的原则,第一个呢,把变化的代码从不变的代码中分离出来,这是第一个,第二个它是针对编接口编程,而不是具体的类。
01:06
也就是说它会定义策略接口。第三个,多用组合或者是聚合,少用继承。那么客户呢,通过组合的方式,或者是通过聚合的方式来使用策略,这是它的核心思想,那这句话呢,用文字来说,可能同学们还是不太明白,那这样子我呢,仍然按照以前的思路给大家画出策略模式的原理图,然后做一个简单的说明来,同学们我们在这里。还是新建?新建一个类图。看一下。好的,那这个类图呢,我们改个名字strategy。对。Strategy,好的,那现在呢,我们来画一下他的这么一个示意图,然后待会呢,我们改进一下这个方案,好吧,就是画完了我们再改进这个方案就行了。他的思想是这样子的。同学们。
02:02
OK,呃,首先呢,它会有一个接口。好,这个接口呢,比如说我们叫做啊,这个接口当然名字就就随意了啊,比如说我们这就叫这个interface吧。Interface OK,那这个interface里面肯定会有很多方法。这是肯定的,会有很多很多方法。维尼吧,那现在呢?我们干什么呢?我们写很多,下面具体的此类。比如说这有一个类A类。对吧,A类我们还有什么类呢?当然这个就A类不合适了,我们取个名字叫做康,那这个名字这这个接口咱们还是按照标准来写吧,叫。OK strategy。OK,这个接口叫我们的策略接口,这有专门的术语叫策略接口,那下面呢,就有这个策略接口具体的实现concrete。
03:02
Strategy。对,那比如说这个呢,是我们具体实现的A。就是我们这个策略接口具体的实现内construct construct a,那显然对方是一个实现的关系。对,那有,诶显然就有可能还有其他的,比如说我们还有另外一个contract。Contract。什么呢?Strategy。GB。对吧,没问题,我们也让他去实现。实现这一个策略接口。那么也那这个时候同学们可以看到。也就是说我下面有,当然这个策略结果可能不止一个啊,可能还有很多其他的。那我们下面有具体的子类来实现你这个策略接口里面方法,那么使用者会怎么用呢?各位同学请看它这里有一个这样的东西。
04:00
Content。比如说我们做一个content。那么这个content呢,它会干什么呢?它这里面注意听,它这里面会有这个接口。OK,也就是说它里面有这样一个东西。船。Strategy。好,然后类型呢,就是我们这个接口类型。对。好,那从这地方可以看出来,他会干什么呢?它会聚合它。哦,聚合到这里面去,那这样就有灵活性呢,什么灵活性呢,我。嗯,我需要用到什么方法,我这个contact需要用到什么方法,我就把这一个具体的策略接口实现的指类的对象传递给他就行了。当然了,有些同学老师这里面有几个呢?可能有多个,比如这是一,他还有第二个,OK。诶,这个呢,就看你的需求来说了。
05:00
这个就看你的需求了,就是就是说有他处理有一个,他可能有两个。这是有可能的,甚至将来还有可能是这样的,同学们啊,注意听哈,就是这个策略接口呢,我们有一个,我们还有另外一个,这也是有可能的B。这个B里面呢,OK啊,里面也有方法,同样的道理,同样的道理,那么在这个地方,它有没有可能还有别的呢?当然也可能,比如说这是我们又一个。接口的具体实现的指令,比如C。比如是D,好,我就四个亿,同学们D同样我们会让,往这边挪一下,我们会让。Concrete。C或者这个D干什么呢,也去实现我们这个接口策略接口。OK啊,那这样子的话呢,这个接口OK,同学们看这个接口呢,它也可以聚合到。
06:00
我们的这个诶写错了,聚合,但也也可以是组合哈,我们说聚合组合呃都可以。好这样子,那这样子同学们可以看到了。呃,那这边我们比如说这有个B。诶,这这地方还不能乱改哈。这个类型怎么改?这样一写的就变了呢,还是他?好,这边还是它。当然了当然了,有同学老师诶,这个地方为什么?哦哦,不好意思,这个地方我写应该是写错了,不是属性啊,不是方法啊,不是方法。三一个。删掉。好,这个呢,我们也把它删掉啊,刚才应该是写错了,好我们再来看。再加一个属性,这样子就对了。诶,比如这是我们的第二个。对,那第二个这个接口呢,我们可以是B了。
07:01
在这里我们可以整合。Strategyb这个接口的它的下面的子类。那这样子的话,就因为我下我这个contact里面有什么方法,我就可以去选用下面的某一个具体实现。就可以了,这就是我们的策略接口的一个示意图,那么我这里做一个小小的说明啊,这个这个地方我就一句话就可以了,说什么呢,从图中可以看,我把这个图截过来。从上面这个图我们可以看到。把这个捞过来,从上面这个图我们可以看到什么样的东西呢?来整理一句话。往下拉。从上面从上图。A从上图可以看到。可以看到什么呢?客户客户这个contact。拥有。有就行了,有什么呢?OK,它有成员变量啊。
08:03
成员变量什么呢?就是。是这个接成员变量,这个变量或者其他的或。或者其他的策略接口。策略接口。因为这个接口呢,可能有多个嘛,我这里写了一个,或者是我们刷B。对,那至于看到至于。至于需要使用到。哪个策略就是我们认为策略下面的指令就是具这个接口下面的具体实现就是策略了,至于需要使用到哪个策略。那干什么呢?我们可以在构造器中制定。好,这就是。那根据这个类图呢,我们就可以来对我们的前面那个压制的项目进行一个改进,好,同学们,那关于策略模式的原理,工作的原理,我们就聊到这儿,待会儿呢,我们用代码来改进压制项目。
我来说两句