策略模式

来源:互联网 发布:华为mate9 数据漫游 编辑:程序博客网 时间:2024/06/11 08:15
 
Strategy pattern 策略模式
在我看来Strategy pattern的精髓不过是完成,功能向属性方向转变,继承向组合方向发展,紧密向松散方向发展。
假设存在这样一个古老的工厂,它可以生产所有可以称之为Viecal的产品,比如赛车,轿车,公共汽车。为使问题简化,我们假设这些具体的产品仅仅是启动方式不同而已。然而非常不幸,由于科技水品的限制,引擎这个概念尚未出世,所以,请原谅我们的工程师看到的不是产品之间引擎的差异,而是产品外在表现的不同。让我们来看看这的破旧的生产流程:
首先定制一个初级设计模型,默认情况下让它像bus一样启动
publicabstractclass Viecal {
         public   Viecal(){
         }
         publicvoid go(){
             System.out.println("bus is driving") ;
         }
publicvoid otherfunction (){
             System.out.println("otherfunction ") ;
         }
 
}
然后根据初级模型,设计具体产品的模型,并根据具体的产品启动方的不同,对原模型进行启动方式的改变。
对于轿车
publicclass car extends Viecal {
         publicvoid go(){
              System.out.println("car is driving") ;
          }
}
对于赛车
publicclass FormularOne extends Viecal {
         publicvoid go(){
              System.out.println("FormularOne is driving") ;
          }
}
显然根据上面的思路,仅仅是汽车出现启动方式的不同,我门的工程师都必须为此定制一个具体的Veical模型。设想人们的需求变得五花八门,比如车窗样式的不同,车倚的不同,汽车设计师门再也招架不住了,因为要设计的具体的Viecal模型是在太多了。好的,即然他们都抱怨自己的工作没法继续,要让他们统统下岗吗?当然不行,Viecal行业必须继续,除非你想放弃大把的钞票。资本家终于想通了,汽车设计师的可以不设置启动功能,但是薪水减20¥,这个难缠的功能交给启动设计师设计,薪水15¥。对于Viecal设计师们来说,仅仅需要留出启动部分所需的空间巴了,而启动设计师设计只需要把这个空间补上。久而久之,两部分的的偶合性越来越低,直到某一天,启动设计师不需要先拿到Viecal模型再往里面接线了,而是提制一个黑盒子往里面一放,整体模型就完成了。似乎有人已经觉察到新的东西,是的,直到有一天,启动设计师完全摆脱了汽车厂商的束缚,独立生产启动装置,也就是那个黑盒子,(各种各样的)引擎终于诞生了!不要停下,真正的革命才刚刚开始,随之而来的,(各种各样的)车轮诞生了,(各种各样的)车灯诞生了-----可以看出,简单产品完全是简单功能的实现,最初的汽车制造,完全由一个厂家从头到尾设计出来,这种模式类似于Viecal类的一层层的继承,通过子类对父类方法的覆盖(或接口的实现),完成功能的转变。然而随着产品的复杂化,带来的趋势就是,产品本生的某些功能(方法)被抽象出来,形成一种属性,这种属性便催生了新产品的诞生。设想最终的情况是什么:原先的Viecal厂家,和他的Viecal设计师消失了,取而代之的是一大堆汽车配件厂,和汽车组装厂。组装师已经不需要直接去考虑汽车功能的实现了,因为具体的功能的实现已经封装到配件中去了,组装师只需考虑将配件组装起来,汽车设计就完成了。那么看看我们崭新的汽车生产流程吧!
publicinterfaceEngine{
           publicvoid go();
}
//赛车发动机
publicclass FormularOneEngine impelementEngine {
           public go()
                System.out.println("FormularOneEngine ok");
);
      }
//轿车发动机
publicclass CarEngine impelementEngine {
           public go()
                System.out.println("CarEngine ok");
);
      }
 
     // 抽象汽车模型
publicabstractclass Viecal {
         privateEngineengineType;
          public Viecal(){
          }
          publicvoid setEngine(Engine egn){
              engineType = egn ;
          }
          publicvoid go(){
              engineType.go() ;
         }
}
//具体car
publicclass car extends Viecal {
    public Jet(){
    setEngine(new CarEngine());
   }
}
Strategy pattern不过是面向对象的一种使用表现形式罢了,看看生活中的例子,程序设计的思想有时也不过如此。
 
原创粉丝点击