一. 定义
策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的用户。
二. 模式起源
三. 设计原则
3.1 原则1
把会变的部分取出并封装起来,以便以后可以轻易地改动或扩充此部分,而不影响不会变化 的部分。
3.2 原则2
使用多态,针对接口编程,而非针对实现编程。
3.3 原则3
多用组合,少用继承。
四. UML图
五. 代码
5.1 Duck父类和子类
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public void swim() {
System.out.println("all duck can swim~");
}
public abstract void display();
public void performFly() {
this.flyBehavior.fly();
}
public void performQuack() {
this.quackBehavior.quack();
}
public FlyBehavior getFlyBehavior() {
return flyBehavior;
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public QuackBehavior getQuackBehavior() {
return quackBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
public class ADuck extends Duck {
public ADuck() {
super.flyBehavior = new AFly();
super.quackBehavior = new AQuack();
}
@Override
public void display() {
System.out.println("A display...");
}
}
public class BDuck extends Duck {
public BDuck() {
super.flyBehavior = new BFly();
super.quackBehavior = new BQuack();
}
@Override
public void display() {
System.out.println("B display...");
}
}
public class CDuck extends Duck {
public CDuck() {
super.flyBehavior = new CFly();
super.quackBehavior = new CQuack();
}
@Override
public void display() {
System.out.println("C display...");
}
}
public class DDuck extends Duck {
public DDuck() {
super.flyBehavior = new DFly();
super.quackBehavior = new DQuack();
}
@Override
public void display() {
System.out.println("D display...");
}
}
5.2 飞行行为接口及实现
public interface FlyBehavior {
public abstract void fly();
}
public class AFly implements FlyBehavior {
@Override
public void fly() {
System.out.println("A fly.....");
}
}
public class BFly implements FlyBehavior {
@Override
public void fly() {
System.out.println("B fly...");
}
}
public class CFly implements FlyBehavior {
@Override
public void fly() {
System.out.println("C fly...");
}
}
public class DFly implements FlyBehavior {
@Override
public void fly() {
System.out.println("D fly...");
}
}
5.3 叫行为接口及其实现
public interface QuackBehavior {
public abstract void quack();
}
public class AQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("A quack...");
}
}
public class BQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("B quack...");
}
}
public class CQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("C quack...");
}
}
public class DQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("D quack...");
}
}
5.4 测试
public class Main {
public static void main(String[] args) {
Duck aDuck = new ADuck();
aDuck.performFly();
aDuck.performQuack();
// 如果想切换飞或叫行为 直接set即可
aDuck.setFlyBehavior(new BFly());
aDuck.setQuackBehavior(new BQuack());
aDuck.performFly();
aDuck.performQuack();
}
}
5.5 结果
A fly.....
A quack...
B fly...
B quack...
六. 感悟
如果需要实现别的飞方式或者叫方式,创建新类添加即可。易扩展。还可以动态切换。