设计模式 - 策略模式
目录
- 基本介绍
- 类图
- 代码
基本介绍
策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
类图
代码
飞翔行为
public interface FlyBehavior {
void fly();
}
public class FlyWithWings implements FlyBehavior{
@Override
public void fly() {
System.out.println("fly with wings~~");
}
}
public class FlyNoWay implements FlyBehavior{
@Override
public void fly() {
System.out.println("can't fly~~");
}
}
public class FlyRocketPowered implements FlyBehavior{
@Override
public void fly() {
System.out.println("fly with a rocket~~");
}
}
鸭子叫
public interface QuackBehavior {
void quack();
}
public class Quack implements QuackBehavior{
@Override
public void quack() {
System.out.println("quack~~");
}
}
public class Squeak implements QuackBehavior{
@Override
public void quack() {
System.out.println("squeak~~");
}
}
public class MuteQuack implements QuackBehavior{
@Override
public void quack() {
System.out.println("can't quack~~");
}
}
鸭子类
public abstract class Duck {
protected FlyBehavior flyBehavior;
protected QuackBehavior quackBehavior;
public Duck() {
}
public void swim(){
System.out.println("swim~~");
}
public abstract void display();
public void performQuack() {
quackBehavior.quack();
}
public void performFly() {
flyBehavior.fly();
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
public class MallardDuck extends Duck{
public MallardDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
@Override
public void display() {
System.out.println("MallarDuck~~");
}
}
public class ModelDuck extends Duck{
public ModelDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
@Override
public void display() {
System.out.println("ModelDuck~~");
}
}
测试类
public class MiniDuckSimulator {
public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly();
System.out.println("====================");
Duck model = new ModelDuck();
model.performFly();
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}