1. 基本原理
策略模式:定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。
以后面的例子说明,下面是类图:
Animal依赖于两个算法接口,而两个接口各自实现了一些具体的算法,这使得Animal和具体的算法解耦;
以下实现了两个类,组合算法:
猫组合了Meow算法和FlyNoWay算法(喵喵叫、不能飞):
狗组合Bark算法和FlyNoWay算法(汪汪叫、不能飞):
2. 实现
针对Animal类,使用策略模式组合两组动作;
2.1. 实现动作
定义两组接口:
public interface FlyBehavior {
String fly();
}
public interface SoundBehavior {
String makeSound();
}
实现FlyBehavior:
import impl.FlyBehavior;
public class FlyNoWay implements FlyBehavior {
public String fly() {
// 不能飞
return "noflyable";
}
}
实现SoundBehavior:
public class Bark implements SoundBehavior {
public String makeSound() {
// 汪汪叫
return "back";
}
}
public class Meow implements SoundBehavior {
public String makeSound() {
// 喵喵叫
return "meow";
}
}
2.2. 组合动作
定义Animal接口:
public abstract class Animal {
String name;
FlyBehavior flyBehavior;
SoundBehavior soundBehavior;
public String getInfo() {
return name + ": " + flyBehavior.fly() + ", " + soundBehavior.makeSound() + ";";
}
}
实现两个具体类:
public class Cat extends Animal {
public Cat(String name) {
super.name = name;
super.flyBehavior = new FlyNoWay();
super.soundBehavior = new Meow();
}
}
public class Dog extends Animal {
public Dog(String name) {
super.name = name;
super.flyBehavior = new FlyNoWay();
super.soundBehavior = new Bark();
}
}
3. 测试
测试Cat类:
public class CatTest {
@Test
public void testCat() {
Animal tom = new Cat("Tom");
System.out.println(tom.getInfo());
}
}
测试Dog类:
public class DogTest {
@Test
public void testDog() {
Animal spike = new Dog("Spike");
System.out.println(spike.getInfo());
}
}
结果:
Tom: noflyable, meow;
Spike: noflyable, back;
结论
如有新的动物,需要不同的行为(例如鸟,可以飞行和喳喳叫),就可以利用现有的类,或添加新的类,实现FlyBehavior和SuondBehavior,然后将二者进行组合即可,如此可以不用修改已有的代码,即符合开闭原则。