设计模式之策略模式-学习笔记

一、含义

定义算法簇,分别封装,使其可以相互替换,此模式让算法的变化独立于使用算法的客户。

二、设计原则

  1. 找出应用中可能需要变化之处,把它们独立出来,不要和不需要变化的代码混合在一起。
  2. 针对接口编程,而不是针对实现编程。
  3. 多用组合,少用继承。

三、机智的Duck设计

代码:

public interface QuackBehavior { //呱呱叫接口
	public void quack();
}

public class Squeak implements QuackBehavior{  //吱吱叫(接口实现)
	public void quack(){
		System.out.println("Squeak");
	}
}

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 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 abstract class Duck {  //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!");  //每个Duck都会游泳
	}

}

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();      //Quack
		mallard.performFly();  //I'm flying!!
	}
}

四、动态添加方法

这才是最重要的!!!

public interface QuackBehavior { //呱呱叫接口
	public void quack();
}

public class Squeak implements QuackBehavior{  //吱吱叫(接口实现)
	public void quack(){
		System.out.println("Squeak");
	}
}

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 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 abstract class Duck {  //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!");  //每个Duck都会游泳
	}
	public void setFlyBehavior(FlyBehavior fb){     //增加设置飞行行为的方法,传入的是FlyBehavior接口
		flyBehavior = fb;
	}
	public void setQuackBehavior(QuackBehavior qb){  //增加设置叫行为的方法,传入的是QuackBehavior接口
		quackBehavior = qb;
	}
}

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 FlyRocketPowered implements FlyBehavior{  //增加使用火箭飞行的类
	public void fly(){
		System.out.println("I'm flying with rocket!");
	}
}

public class ModelDuck extends Duck {  //继承的模型鸭类
	public ModelDuck(){
		flyBehavior = new FlyNoWay();
		quackBehavior = new Quack();
	}
	public void display(){
		System.out.println("I'm a model duck");
	}
	

}

public class MiniDuckSimulator {
	public static void main(String[] args){
		Duck mallard = new MallardDuck();
		mallard.performQuack();   //Quack
		mallard.performFly();   //I'm flying!!
		
		Duck model = new ModelDuck();
		model.performFly();  //I can't fly
		model.setFlyBehavior(new FlyRocketPowered());  //动态改变鸭的飞行行为
		model.performFly(); //I'm flying with rocket!
	}
}

 

参考书籍


《Head First 设计模式》弗里曼等著;北京:中国电力出版社.2007.9