参考:http://blog.csdn.net/gnuhpc/article/details/5360328#
策略模式定义了算法簇,分别封装起来,让它们之间可以互相替换,此模式让方法的变化独立于使用方法的Client,适用于继承后的动作发生变化,要动态的改变对象的行为时。
核心思想:将is-a 转换为has-a.
基本的思路:将一些原先要继承的方法,以接口的方式抽象出来,然后再以实现该接口的方式定义一些类以完成实际能力的实现;同时在基类中以组合的方式将该接口的实例放入基类,基类同时提供设置这个实例的接口以及这个方法的封装,子类继承基类是对这些接口实例进行设置即可。
设计原则1:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起,把会变化的部分取出并封装起来,好让其他部分不会受到影响
设计原则2:针对接口编程,而不是针对实现编程。
针对实现编程 | 针对接口编程 | 更好的针对接口编程 |
Dog d=new Dog(); d.dark(); | Animal animal=new Dog(); animal.makesound(); | a = getAnimal(); a.makeSound(); |
不得不针对具体实现coding | 利用animal多态处理 | 运行时才指定具体实现的对象 |
类图:
鸭子的设计问题:
代码:
//fly行为
// 飞行接口
public interface FlyBehavior {
public void fly();
}
// 飞
public class FlyWithWings implements FlyBehavior{
public void fly() {
System.out.println("正在用翅膀飞行");
}
}
// 不飞
public class FlyNoWay implements FlyBehavior{
public void fly() {
System.out.println("不会飞");
}
}
//坐火箭飞
public class FlyRocketPowered implements FlyBehavior{
public void fly() {
System.out.println("坐火箭飞");
}
}
quack行为
// 叫接口
public interface QuackBehavior {
public void quack();
}
// 嘎嘎叫
public class Quack implements QuackBehavior. {
public void quack() {
System.out.println("嘎嘎叫");
}
}
// 吱吱叫
public class Squeak implements QuackBehavior{
public void quack() {
System.out.println("吱吱叫");
}
}
// 不叫
public class MuteQuack implements QuackBehavior{
public void quack() {
System.out.println("不会叫");
}
}
//实现Duck类
// 鸭子超类
public abstract class Duck {
// 默认的行为
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
public void setFlyBehavior(FlyBehavior. fb) {
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior. qb) {
quackBehavior = qb;
}
abstract void display();
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
public void swim() {
System.out.println("正在游泳~~");
}
}
建立不同的鸭子类
// 野鸭
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings(); //这里也可以使用setFlyBehavior方法,下同!
}
public void display() {
System.out.println("绿头鸭");
}
}
// 红头鸭
public class RedHeadDuck extends Duck {
public RedHeadDuck() {
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}
public void display() {
System.out.println("红头鸭");
}
}
// 橡皮鸭
public class RubberDuck extends Duck {
public RubberDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Squeak();
}
public void display() {
System.out.println("橡皮鸭");
}
}
//模型鸭
public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
public void display() {
System.out.println("模型鸭");
}
}
//测试代码:
public class MiniDuckSimulator {
public static void main(String[] args) {
MallardDuck mallard = new MallardDuck();
RubberDuck rubberDuckie = new RubberDuck();
RedHeadDuck redHeadDuck = new RedHeadDuck();
ModelDuck model = new ModelDuck();
mallard.performQuack();
rubberDuckie.performQuack();
redHeadDuck.performQuack();
model.performFly();
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}