策略模式

    在讲策略模式前,我们首先讲一下”继承“。继承(英语:inheritance)是面向对象软件技术当中的一个概念。如果一个类别B“继承自”另一个类别A,就把这个B称为“A的子类”,而把A称为“B的父类别”也可以称“A是B的超类”。继承可以使得子类具有父类别的各种属性和方法,而不需要再次编写相同的代码。

    现在举个例子,以java为例:

public class Animal{

      public void walk(){

 

}

public void fly(){

}

}

    再定义一个bird类,可以继承Animal,这样,bird就有了走和飞的行为。

    但并不是所有的动物都会飞,比如dog就不会飞,这样,dog还可以继承Animal吗?有人说可以让dog继承Animal,然后覆盖fly方法,并在方法体内置空。这样的问题就是,1不优美,既然没有这样的行为,为什么还要对外暴露?2繁琐,以后每次有一个Animal新的子类出现,就要被迫检查并可能需要覆盖fly方法,这会是无穷无尽的噩梦。

     这个时候,有人会想到,继承不行,可以用实现接口的形式。定义一个Flyable接口,让只会飞的动物才实现Flyable,但是实现接口无法达到代码的复用。这就意味着,无论何时你需要修改某个行为,必须往下追踪并在每一个定义此行为的类中修改它,这样也会出现两个问题:1.增加任务量,2.容易出现新的错误。

      由于继承和实现都会有这样那样的问题,所以我们就要思考,是不是可以定义一个行为接口FlyBehavior,这样,bird和dog都不用去实现fly方法,反而是我们制造一组其他类专门实现FlyBehavior,这就成为行为类。由行为类而不是Animal类来实现行为接口。

    我们来回顾一下,以前的做法是,行为来自Animal超类的具体实现,或是继承某个接口并由子类自行实现而来。而这两种做法都是依赖于”实现“,完全耦合在了一起,更改行为难度较大;而在我们新的设计中,特定的具体行为编写在了实现了FlyBehavior接口的类中,并没有死死地绑定在Animal的实现类中。这就是策略模式。

    Animal现在会将飞行的行为委托给别人去处理,而不是使用定义的Animal类(或子类)内的fly方法。做法如下:

   1.在Animal类中加入一个实例变量FayBehavior,声明为接口类型,而每一个Animal的子类都会动态的设置这些变量。我们也必须将Animal与其所有子类中的fly方法删除,因为这些行为已经被搬到FlyBehavior中了,在FlyBehavior中声明为行为方法fly。

   2. bird类如下

     public class Bird{

       public FlyBehavior flyBehavior;

      public Bird(FlyBehavior slowFly){

          this.flyBehavior = slowFly;

      public void performFly(){

         flyBehavior.fly();

}

}

这样就做成了解耦,别的能飞的动物也可以复用FlyBehavior子类中的代码,只要他们的飞行方式一样。而行为方式如果有变,只需修改FlyBehavior的某个子类就OK了。

     策略模式给我们的启发就是,多用组合、少用继承。总的来说,策略模式定义了算法簇,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值