良好的oo设计必须具备可复用、可扩充、可维护三个特性
设计原则:封装变化(找出应用中需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。另一种说法是:把会变化的部分取出来并封装起来,以便日后可以轻易改动或扩充此部分,而不影响不需要变化的其他部分。)
设计原则:针对接口编程,而不是针对实现编程
设计原则:多用组合,少用继承。
策略模式:定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户
抽象类:
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
// TODO Auto-generated constructor stub
}
abstract void display();
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
//设置可改变行为状态
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
接口:
public interface FlyBehavior {
void fly();
}
实现接口:
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("no fly");
}
public interface QuackBehavior {
void quack();
}
}
public class Quack implements QuackBehavior {
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("quack");
}
}
继承抽象类:
public class MallardDuck extends Duck {
public MallardDuck() {
// TODO Auto-generated constructor stub
quackBehavior = new Quack();
flyBehavior = new FlyWithWing();
}
@Override
void display() {
// TODO Auto-generated method stub
System.out.println("i am a real mallard duck");
}
}
public class ModalDuck extends Duck {
public ModalDuck() {
// TODO Auto-generated constructor stub
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
@Override
void display() {
// TODO Auto-generated method stub
System.out.println("i am a modal duck");
}
}
public class MiniDuckSimulator {
public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.performFly();
mallard.performQuack();
Duck modal = new ModalDuck();
modal.performFly();
modal.setFlyBehavior(new FlyRocketPowered());//动态改变行为
modal.performFly();
}
}