1. 策略模式:定义了算法族,分别封装起来,让它们之间可以替换,此模式让算法的变化独立于使用该算法的用户。(利用组合)
类图如下:
源代码如下:
package Strategy;
/**
* 鸭子超类
* @author Arvon
*
*/
public abstract class Duck {
public Duck() {
super();
// TODO Auto-generated constructor stub
}
FlyBehavior mFlyBehavior; //has A 组合行为
QuackBehavior mQuackBehavior; //has A 组合行为
public void swim(){
System.out.println("All ducks float, even decoys!");
}
public abstract void display();
public void performFly(){
mFlyBehavior.fly(); //委托给行为类处理
}
public void performQuack(){
mQuackBehavior.quack(); //委托给行为类处理
}
public void setmFlyBehavior(FlyBehavior mFlyBehavior) {
this.mFlyBehavior = mFlyBehavior;
}
public void setmQuackBehavior(QuackBehavior mQuackBehavior) {
this.mQuackBehavior = mQuackBehavior;
}
}
package Strategy;
/**
* 飞行类鸭子的接口
* @author Administrator
*
*/
public interface FlyBehavior {
public void fly();
}
package Strategy;
/**
* 叫行为鸭子接口
* @author Administrator
*
*/
public interface QuackBehavior {
public void quack();
}
package Strategy;
public class FlyNoWays implements FlyBehavior {
@Override
public void fly() {
System.out.println("I can't fly");
}
}
package Strategy;
public class FlyRocketPowered implements FlyBehavior {
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I'm flying with a rocket");
}
}
package Strategy;
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("I'm flying!!");
}
}
package Strategy;
public class Quack implements QuackBehavior {
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("Quack");
}
}
package Strategy;
public class MuteQuack implements QuackBehavior {
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("<< Silence >>");
}
}
package Strategy;
public class Squeak implements QuackBehavior {
@Override
public void quack() {
System.out.println("Squeak");
}
}
package Strategy;
public class MallardDuck extends Duck {
/**
* 申明我是一只用翅膀飞并会嘎嘎叫的鸭子
*/
public MallardDuck() {
super();
mFlyBehavior = new FlyWithWings();
mQuackBehavior = new Quack();
}
@Override
public void display() {
System.out.println("I'm a real Mallard duck");
}
}
package Strategy;
public class DecoyDuck extends Duck {
/**
* 申明我是一只不会叫也不会飞的鸭子
*/
public DecoyDuck() {
super();
// TODO Auto-generated constructor stub
mFlyBehavior = new FlyNoWays();
mQuackBehavior = new MuteQuack();
}
@Override
public void display() {
System.out.println("I'm a duck Decoy");
}
}
package Strategy;
public class ModelDuck extends Duck {
public ModelDuck() {
super();
// TODO Auto-generated constructor stub
mFlyBehavior = new FlyNoWays();
mQuackBehavior = new Quack();
}
@Override
public void display() {
System.out.println("I'm a model duck");
}
}
package Strategy;
/**
* 测试类
* @author Administrator
*
*/
public class MiniDuckSimulator {
public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.performFly();
mallard.performQuack();
mallard.display();
Duck decoy = new DecoyDuck();
decoy.performFly();
decoy.performQuack();
decoy.display();
Duck model = new ModelDuck();
model.performFly();;
model.performQuack();
model.display();
//动态地改变鸭子的行为
model.setmFlyBehavior(new FlyRocketPowered());
model.performFly();;
model.performQuack();
model.display();
}
}
程序的输出:
I'm flying!!
Quack
I'm a real Mallard duck
I can't fly
<< Silence >>
I'm a duck Decoy
I can't fly
Quack
I'm a model duck
I'm flying with a rocket
Quack
I'm a model duck