今天,我们来介绍一下设计模式中的策略模式。
一、策略模式的概念
策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法独立于使用算法的客户。
二、策略模式的原理
针对接口编程,而不是针对实现编程。
三、案例分析
鸭子有各种各样的行为,例如飞行或者鸣叫,同时,鸭子也可以分为各种各样的品种,有一些品种的鸭子会飞会叫,有一些鸭子会叫不会飞。用一个设计模式能够更好地满足以下条件:
1、鸭子的各种行为能够被其他对象复用。
2、可以新增一些行为,可以不用影响既有的行为类与使用该行为的对象类。
3、对象类能够对动态地设定行为。
四、类图关系
首先,不再把鸭子的各种行为说成是“一组行为”,我们开始把行为想成是“一簇算法”,算法代表了鸭子能干的各种事(包括飞行与鸣叫)。以下是该模式的类图
五、个人见解
策略模式主要是将变化的行为从实体类分离出来,将会变化的行为封装起来,实现了面向接口的编程,而不是面向实现编程的设计原则,大大提高了代码的复用性,也具有继承的优点,避免了继承被滥用所造成的代码在多个子类中重用,运行时不容易改变行为,很难知道所有实体类的全部行为以及牵一发而动全身等等弊端。
六、模式优点
使用策略模式可以让鸭子实体与鸭子的呱呱叫以及飞行动作分离出来,使这些行为能够被其他对象复用,因为这些行为已经和鸭子类没有什么关系了。而且,我们还可以新增一些行为,不会影响到现有的行为类以及使用该行为的鸭子类。
七、应用场景
主要适用于需要把行为从主体类中分离出来的场景,例如:一款射击类游戏,玩家可以具有射击的动作,而射击动作又可以分为用石头射击,用子弹射击,用大炮射击等等,这些就构成了一组算法簇,这些行为是可以相互替换的。实现大致代码如下:
class Player{
private Shoot shoot;
public Player(Shoot shoot){
this.shoot=shoot;
}
public shooting(){
shoot.shooting();
}
private setShoot(Shoot shoot){
this.shoot=shoot;
}
}
//射击行为
public Interface Shoot(){
public shooting();
}
class ShootWithStone implements Shoot{
public shooting(){
// 具体实现用石头射击的行为
}
}
class ShootWithGum implements Shoot{
public shooting(){
//具体实现用枪射击的行为
}
}
class ShootWithCannon implements Shoot{
public shooting(){
//具体实现用大炮射击的行为
}
}