定义:设计一组可以互相替换的算法,使得算法使用者不会因为算法的变化而在代码结构上受到影响。
使用场景:业务功能经常发生改变或者定制性比较强的功能点
类图:
代码样例:典型的Has-A关系
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
public void setFlyBehavior (FlyBehavior fb) {
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}
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 Quack implements QuackBehavior {
public void quack() {
System.out.println("Quack");
}
}
public interface QuackBehavior {
public void quack();
}
public class FlyWithWings implements FlyBehavior {
public void fly() {
System.out.println("I'm flying!!");
}
}
优点:1)算法可以互相替换,减少对代码结构的影响
缺点:
类似的设计模式:
配套的内功心法:
1)识别可能会变化的功能,封装它们,以减少对稳定功能的影响;
2)尽量面向接口编程而不是面向实现编程;
3)优先使用组合,而非继承;
4)程序员可以通过设计模式提升沟通效率