1 设计原则1
找出应用中的可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
把会变化的部分取出并封装起来,好让其他部分不会受到影响。
代码变化引起的不经意后果变少,系统变得更有弹性。
2 设计原则2
针对接口编程,而不是针对实现编程
变量的声明类型应该是一个超类型,通常是一个抽象类或者接口。
针对实现编程
Dog d = new Dog();
d.bark();
针对接口/超类型编程
Animal a = getAnimal();
a.makesound();
Duck及其子类
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
//动态设定行为
public void setFlyBehavior(FlyBehavior fb) {
flyBehavior = fb;
}
public void setQuackBehavior(FlyBehavior qb) {
quackBehavior = qb;
}
}
public class MallardDuck() {
public ModelDuck(){
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
}
行为接口
public interface FlyBehavior {
public void fly();
}
public interface QuackBehavior {
public void quack();
}
具体行为接口实现类
public class FlyWithWings implements FlyBehavior {
public void fly() {
System.out.println("I'm flying!");
}
}
public class FlyNoWay implements FlyBehavior {
public void fly() {
System.out.println("I can't fly!");
}
}
public class Quack implements QuackBehavior {
public void quack() {
System.out.println("Quack!Quack!");
}
}
public class MuteQuack implements QuackBehavior {
public void quack() {
System.out.println("<< silence >>");
}
}
测试类
Duck mallard = new MallardDuck();
mallard.performFly();
mallard.performQuack();
mallrad.setFlyBehavior(new FlyNoWay());
mallard.performFly();