设计模式入门-策略模式

设计模式入门-策略模式


设计原则

找出应用中可能需要变化的地方,把他们独立出来,不要和那些不需要变化的代码何在一起。

当一个类中的一些属性和方法经常会发生变化,可能会随着之后的需求而做修改,则建议将这些属性和方法提取出来进行封装,和其他稳定的代码区别开来,以便以后可以轻易的改动或扩充此部分,这个原则也是每个设计模式背后的精神所在。

针对接口编程,而不是针对实现

“针对接口编程”真正的意思是“针对超类型编程”,我们在编程的时候只需要针对接口所提供的行为进行编程,而不需要去关注去行为的具体实现的过程,每个具有相应行为的人都要去继承该接口,例如:

定义了一个Animals的抽象类,Dog类和Cat类分别继承了该抽象类,并且实现了相应的bark()方法

针对实现编程就是:

//针对的是具体的Dog实现类进行操作
Dog dog = new Dog();
dog.bark();

针对接口编程则是:

Animals dog = new Dog();//利用Animals进行多态调用
dog.bark();

而且子类的实例化可以不用硬编码在代码中,而是根据运行时的指定儿产生具体的实现类,如:

Animals a = getAnimals();
a.bark();
多用组合,少用继承 => 组合:“有一个”的关系 继承:“是一个”的关系

比如:Duck是超类,MuteDuck继承了Duck,在MuteDuck中飞的行为不是从Duck继承过来的(如果是继承的,那Duck的所有子类都是一样的飞行方式),因为不同的子类有不同的飞行的方式,这个飞行的方式是和适当的行为对象进行组合而来。

例如:

图片1

在Duck类中组合了FlyBehavior和QuackBehavior,然后根据具体的Duck类型来指定具体的行为类型。使用组合可以在运行时动态的改变实现类的具体行为,例如上图中下面的两个方法就用来运行时指定Duck的子类的具体的行为方式。

例如:

图片2

其中MallarDuck是Duck的子类,在MallarDuck中有默认的行为方式,在下面又调用相应的行为的set方法来动态的改变了当前对象的行为方式。

策略模式

以上的分析过程实际就是策略模式,该模式定义了一些算法簇(就是上面定义的行为接口等),然后分别进行封装起来,让他们之间可以相互转换,这就使得当我使用这些算法的时候是不需要关注这些算法的变化,从而让这些变化完全独立于用户。

梳理一下整个设计的方法:

首先分析Duck类,将其中的变化的部分抽象出来,不变的部分保留。

变化的那一部分抽象之后得到了两个接口:FlyBehavior和QuackBehavior,这两个接口分别封装了飞行和叫这两种行为(注意:这两个行为不一定是只有Duck及其子类使用,也可以提供给其他类使用,如:鸭鸣器也可以发出鸭子的声音,从而达到了代码重用的功能),然后在Duck类中组合这两种行为。

然后,分别为 FlyBehavior和QuackBehavior实现不同的行为方式,以提供给其他的类进行使用,例如:

FlyWityWings 和 FlyNoWay实现了FlyBehavior接口,DoMute、DoQuack和DoSqueak实现了QuackBehavior接口。

接着,MallarDuck继承了Duck,然后在该类中配置该类应该具有的行为操作,如下:

这里写图片描述

这就指定了MallarDuck具有FlyWithWings和DoQuack两个行为,并且同过上述的Duck类可以看到,还可以在运行时通过set方法来设置MallarDuck的动态行为。

以上便是策略模式的思考过程。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值