设计模式之策略模式
官方说明设计模式的3个角色:
- 环境角色:context , 持有一个策略的引用
- 抽象策略角色,是一个抽象角色,此角色给出所有的具体策略类所需的接口
- 具体策略角色,包装了相关的算法和行为。即抽象策略的具体实现
借图说明之间相互关系:
策略模式特点:
- 重心不在于如何实现算法,在于如何组织、调用这些算法
- 各个策略算法是相互独立、没有依赖、各个之间平等
案例:(写了一遍网上流行的真鸭子,假鸭子DUCK会不会飞的案例)
情景:
对象:真鸭子,石头鸭子,
能力:都会游泳(假如),真鸭子会飞,石头鸭子不会飞
策略实现:
/**
* 真鸭子,石头鸭子实现的抽象类
*/
public abstract class DUCK {
/**
* 持有一个Strategy的引用。即封装了接口鸭子飞这个行为接口
*/
IFlyBehavior flyBehavior;
void setFlyBehavior(IFlyBehavior fb) {
flyBehavior = fb;
}
abstract void swim();
public void fly() {
flyBehavior.fly();
}
}
石头鸭子和真鸭子实体类,继承抽象类DUCK
public class StoneDuck extends DUCK {
public StoneDuck() {
flyBehavior = new BadFlyBehavior();
}
@Override
void swim() {
System.out.println("******");
}
}
public class RealDuck extends DUCK {
public RealDuck() {
flyBehavior = new GoodFlyBehavior();
}
@Override
void swim() {
System.out.println("*********");
}
}
鸭子会飞这个能力的策略抽象接口:
/**
* 给出所有的具体策略类所需的接口
*/
public interface IFlyBehavior {
/**
* 鸭子飞翔的动作
*/
void fly();
}
public class GoodFlyBehavior implements IFlyBehavior {
@Override
public void fly() {
System.out.println("****I can fly****");
}
}
public class BadFlyBehavior implements IFlyBehavior {
@Override
public void fly() {
System.out.println("***not fly***");
}
}
public static void main(String[] args) {
DUCK stoneDuck = new StoneDuck();
stoneDuck.fly();
// 改变策略
stoneDuck.setFlyBehavior(new GoodFlyBehavior());
stoneDuck.fly();
/**
* 打印结果:
*
* ***not fly***
* ****I can fly****
*
*/
}