策略模式
模式概念:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
设计思想:将变化的部分封装成接口及其具体实现类,例如将飞行行为和呱呱叫行为封装起来,这样的设计,使得它们可以被其他的对象复用,因为这些行为已经与鸭子类无关了,我们也可以新增一些行为,不会影响到既有的行为类,也不会影响“使用”到飞行行为的鸭子类;从Duck类的角度来看,把不变的部分留下来,把变化的部分(飞行行为和呱呱叫行为)委托出去,而不是使用定义在Duck类或子类内的飞行方法和呱呱叫方法。
/**
* 封装飞行行为
*
*/
public interface FlyBehavior {
public void fly();
}
public class FlyWithWings implements FlyBehavior{
public void fly() {
System.out.println("I am flying!");
}
}
public class FlyNoWay implements FlyBehavior{
public void fly() {
System.out.println("I cannot fly!");
}
}
/**
* 封装呱呱叫行为
*
*/
public interface QuackBehavior {
public void quack();
}
public class Quack implements QuackBehavior{
public void quack() {
System.out.println("Quack");
}
}
public class MuteQuack implements QuackBehavior{
public void quack() {
System.out.println("silent");
}
}
public class Squeak implements QuackBehavior{
public void quack(){
System.out.println("Squeak");
}
}
/**
* 抽象鸭子类
*
*/
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 setFlyBehavior(FlyBehavior fb){
flyBehavior = fb;
}
/*可以动态改变呱呱叫行为*/
public void setQuackBehavior(QuackBehavior qb){
quackBehavior = qb;
}
public void swim(){
System.out.println("all ducks float, even decoys!");
}
}
/**
* 子类MallrdDuck
*
*/
public class MallardDuck extends Duck{
public MallardDuck(){
quackBehavior = new Quack();//获得具体实现类
flyBehavior = new FlyWithWings();//获得具体实现类
}
public void display() {
System.out.println("i am a Mallard Duck!");
}
}
/**
* MainClass
*
*/
public class MainClass {
public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly();
/*运行时动态改变其行为*/
mallard.setFlyBehavior(new FlyNoWay());
mallard.setQuackBehavior(new Squeak());
mallard.performQuack();
mallard.performFly();
}
}