Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides
OO原則是我們的目标,而設計模式是我們的做法。
把模式裝進腦子裡,然後在你的設計和已有的應用中,尋找何處可以使用它們。
除非你很積極地讓神經元活動起來,否則你的頭腦裡什麼也不會發生。
學得更快、更深入,集中注意力,怎樣思考的?學習方法?
Dog d = new Dog();
d.bark();
Animal animal = new Dog();
annimal.bark();
a = getAnimal();
a.makeSound();
public class Duck ... {
QuackBehavior quackBehavior;
//還有更多
public void performQuack() ...{
quackBehavior.quack();
}
}
public class MallardDuck extends Duck ... {
public MallardDuck() ...{
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
public display() ...{
System.out.println("I'm a real Mallard duck");
}
}
public abstract class Duck ... {
FlyBehavior flyBehavior;
QuackBehavior quackbehavior;
public Duck() ...{
}
public abstract void display();
public void peformFly() ...{
flyBehavior.fly();
}
public void peformQuack() ...{
quackBehavior.quack();
}
public void swim() ...{
System.out.println("All ducks float, even decoys!");
}
}
public interface FlyBehavior ... {
public void fly();
}
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 interface QuackBehavior ... {
public void quack();
}
public class Quack implements QuackBehavior ... {
public void quack() ...{
System.out.println("Quack");
}
}
public class MuteQuack implements QuackBehavior ... {
public void quack() ...{
System.out.println("Squeak");
}
}
-->
public class MiniDuckSimulator ... {
public static void main(String[] args) ...{
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly();
}
}
==>
Quack
I ' m flying!
#動态設定行為
public void setFlyBehavior(FlyBehavior fb) ... {
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) ... {
quackBehavior = qb;
}
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 FlyRocketPowered implements FlyBehavior ... {
public void fly() ...{
System.out.println("I'm flying with a rocket!");
}
}
public class MiniDuckSimulator ... {
public static void main(String[] args) ...{
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly();
Duck model = new ModelDuck();
model.performFly();
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}
==>
Quack
I ' m flying!
I can ' t fly
I ' m flying with a rocket!
時刻思考着:模式如何依賴基礎與原則
OO原則:
1.找出應用中可能需要變化之處,把他們獨立出來,不要和那些不需要變化的代碼混在一起。
把會變化的部分取出并封裝起來,以便以後可以輕易地改動或擴充此部分,而不影響不需要變化的其他部分。
2.針對接口程式設計,而不是針對實作程式設計。
3.多用組合,少用繼承。