设计原则:找出应用可能需要变化之处,把它们独立出来,不要和那个不需要变化的代码放在一起.
设计原则:多用组合,少用继承.
设计原则:针对接口编程,而不是针对实现编程.
背景:需要设计一个鸭子类,有飞行和呱呱叫两种行为.可是后来引入了橡皮鸭,导致传统的继承处理无法使用(不能让橡皮鸭也会飞)而且还可能会有既不会飞也不会叫的鸭子,或者需要引入不同种鸭子的具体的飞行运行,叫的声音......
策略模式:把易变的动作部分抽象出来成为单独的类(接口).
定义:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户.
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 interface FlyBehavior {
public void fly();
}
public class FlyNoWay implements FlyBehavior{
public void fly() {
System.out.println("I can't fly");
}
}
public class FlyWithWings implements FlyBehavior{
public void fly() {
System.out.println("I'm flying!!");
}
}
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("<<Silence>>");
}
}
public class Squeak implements QuackBehavior{
public void quack() {
System.out.println("Squeak");
}
}
public class MallardDuck extends Duck{
public MallardDuck(){
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
public void display() {
System.out.println("I'm a real Mallard duck.");
}
}
测试类:
public class MiniDuckSimulator {
public static void main(String[] args){
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly();
}
}