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