设计模式 - 策略模式(Strategy Pattern) 详解
2014-05-22 19:37
477 查看
策略模式(Strategy Pattern) 详解
策略模式: 定义了算法族, 分别封装起来, 让它们之间可以相互替换, 此模式让算法的变化独立于使用算法的客户.对于父类的子类族需要经常扩展新的功能, 为了使用父类比较灵活的添加子类, 把父类的行为写成接口(interface)的形式;
使用set()方法, 重新设定接口的行为. 提供行为的调用的方法(如perform), 需要调用接口(interface)的固有方法(fly & quack)即可.
代码:
[java] view plaincopy
package strategy;
public abstract class Duck { //抽象类
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() { //构造函数
}
public abstract void display(); //抽象函数
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
public void swim() {
System.out.println("All ducks float, even decoys! ");
}
public void setFlyBehavior(FlyBehavior fb) {
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}
}
FlyBehavior 和 QuackBehavior是两个接口(interface), 包含方法fly()和quack();
继承接口的方法, 都必须使用fly()和quack()的方法;
代码:
[java] view plaincopy
/**
* @time 2014.5.22
*/
package strategy;
/**
* @author C.L.Wang
*
*/
public interface FlyBehavior {
public void fly();
}
[java] view plaincopy
/**
* @time 2014.5.22
*/
package strategy;
/**
* @author C.L.Wang
*
*/
public interface QuackBehavior {
public void quack();
}
接口的实现.
代码:
[java] view plaincopy
/**
* @time 2014.5.22
*/
package strategy;
/**
* @author C.L.Wang
*
*/
public class FlyNoWay implements FlyBehavior {
/* (non-Javadoc)
* @see strategy.FlyBehavior#fly()
*/
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I can't fly! ");
}
}
[java] view plaincopy
/**
*
*/
package strategy;
/**
* @author Administrator
*
*/
public class FlyRocketPowerd implements FlyBehavior {
/* (non-Javadoc)
* @see strategy.FlyBehavior#fly()
*/
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I'm flying with a rocket! ");
}
}
[java] view plaincopy
/**
*
*/
package strategy;
/**
* @author Administrator
*
*/
public class FlyRocketPowerd implements FlyBehavior {
/* (non-Javadoc)
* @see strategy.FlyBehavior#fly()
*/
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I'm flying with a rocket! ");
}
}
[java] view plaincopy
/**
*
*/
package strategy;
/**
* @author Administrator
*
*/
public class MuteQuack implements QuackBehavior {
/* (non-Javadoc)
* @see strategy.QuackBehavior#quack()
*/
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("<< Silence >>");
}
}
[java] view plaincopy
/**
*
*/
package strategy;
/**
* @author Administrator
*
*/
public class Quack implements QuackBehavior {
/* (non-Javadoc)
* @see strategy.QuackBehavior#quack()
*/
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("Quack! ");
}
}
[java] view plaincopy
/**
*
*/
package strategy;
/**
* @author Administrator
*
*/
public class Squeak implements QuackBehavior {
/* (non-Javadoc)
* @see strategy.QuackBehavior#quack()
*/
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("Squeak");
}
}
继承父类的子类, 只需要指定所使用的行为(即 接口(interface)的实现)的类型, 并提供自己的display()函数即可;
代码:
[java] view plaincopy
/**
*
*/
package strategy;
/**
* @author Administrator
*
*/
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
/* (non-Javadoc)
* @see strategy.Duck#display()
*/
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("I'm a real Mallard duck! ");
}
}
[java] view plaincopy
/**
*
*/
package strategy;
/**
* @author Administrator
*
*/
public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
/* (non-Javadoc)
* @see strategy.Duck#display()
*/
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("I'm a model duck. ");
}
}
执行时, 只需要执行各个子类继承父类的方法(perform), 即可, 也可以使用set()方法改变其行为;
代码:
[java] view plaincopy
/**
*
*/
package strategy;
/**
* @author Administrator
*
*/
public class MiniDuckSimulator {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly();
Duck model = new ModelDuck();
model.performFly();
model.performQuack();
model.setFlyBehavior(new FlyRocketPowerd());
model.performFly();
}
}
面向对象的原则:
1. 封装变化的部分;
2. 多用组合, 少用继承;
3. 针对接口编程, 不针对实现编程;
相关文章推荐
- 【设计模式】策略模式详解
- Java设计模式(二)策略模式详解
- Spring架构详解之Spring设计模式分析之策略模式
- Android设计模式之策略模式详解
- Java经典设计模式之策略模式原理与用法详解
- 基于Android设计模式之--SDK源码之策略模式的详解
- [设计模式](十):策略模式(Strategy)与模板模式(Template)详解及二者间区别介绍(两种父子类行为模式)
- Java开发中的23种设计模式详解----策略模式(strategy)
- 设计模式中的多态——策略模式详解
- 详解Python设计模式编程中观察者模式与策略模式的运用
- Java设计模式之策略模式详解
- Java设计模式之策略模式详解
- Android编程设计模式之策略模式详解
- 设计模式 - 策略模式(Strategy Pattern) 详解
- 详解C++设计模式编程中策略模式的优缺点及实现
- 设计模式——策略模式详解
- Java设计模式之策略模式详解
- Java设计模式之策略模式原理与用法实例详解
- 走穿java23种设计模式--16策略模式详解
- 详解Java设计模式编程中的策略模式