一、含义
定义算法簇,分别封装,使其可以相互替换,此模式让算法的变化独立于使用算法的客户。
二、设计原则
- 找出应用中可能需要变化之处,把它们独立出来,不要和不需要变化的代码混合在一起。
- 针对接口编程,而不是针对实现编程。
- 多用组合,少用继承。
三、机智的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