設計原則:
找出應用中可能需要變化之處,把他們獨立出來,不要和那些不需要變化的代碼混在一起。如果每次新的需求一來,都會是某方面的代碼發生變化,那麼這部分的代碼需要被抽出來,和其他穩定的代碼有所區分。
另一種思考方式:把會變化的部分取出并封裝起來,以便以後輕易地改動或擴充此部分,而不影響不需要變化的其他部分。
針對接口程式設計,而不是針對實作程式設計。針對接口程式設計真正的意思是“針對超類型(supertype)程式設計(可以是接口或抽象類)”,針對接口程式設計關鍵就在于多态。利用多态,程式可以針對超類程式設計,執行時會根據實際狀況執行到真正的行為,不會被綁死在超類型的行為上。
接口FlyBehavior:飛行行為是變化的,應當獨立出來,并由不一樣的飛行類來繼承飛行動作這個接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<code>public</code> <code>interface</code> <code>FlyBehavior {</code>
<code> </code><code>public</code> <code>void</code> <code>fly();</code>
<code>}</code>
<code>//===================================================//</code>
<code>public</code> <code>class</code> <code>FlyWithWings </code><code>implements</code> <code>FlyBehavior {</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>void</code> <code>fly() {</code>
<code> </code><code>// TODO Auto-generated method stub</code>
<code> </code><code>System.out.println(</code><code>"I'm flying!!"</code><code>);</code>
<code> </code><code>}</code>
<code>public</code> <code>class</code> <code>FlyNoWay </code><code>implements</code> <code>FlyBehavior {</code>
<code> </code><code>System.out.println(</code><code>"I'm can't fly!"</code><code>);</code>
接口QuackBehavior:發聲行為是變化的,應當獨立出來,并由不一樣的發聲類來繼承發聲動作這個接口。
20
21
22
23
24
25
26
27
<code>public</code> <code>interface</code> <code>QuackBehavior {</code>
<code> </code><code>public</code> <code>void</code> <code>quack();</code>
<code>//====================================================//</code>
<code>public</code> <code>class</code> <code>Quack </code><code>implements</code> <code>QuackBehavior {</code>
<code> </code><code>public</code> <code>void</code> <code>quack() {</code>
<code> </code><code>System.out.println(</code><code>"Quack"</code><code>);</code>
<code>public</code> <code>class</code> <code>MuteQuack </code><code>implements</code> <code>QuackBehavior {</code>
<code> </code><code>System.out.println(</code><code>"<< Silence >>"</code><code>);</code>
<code>public</code> <code>class</code> <code>Squeak </code><code>implements</code> <code>QuackBehavior {</code>
<code> </code><code>System.out.println(</code><code>"Squeak"</code><code>);</code>
Duck 抽象類 鴨子現在将飛行和發聲的多做委托給别人處理,而不是在自己類内部飛行和發聲。
<code>public</code> <code>abstract</code> <code>class</code> <code>Duck {</code>
<code> </code><code>FlyBehavior flyBehavior;</code>
<code> </code><code>QuackBehavior quackBehavior;</code>
<code> </code><code>public</code> <code>Duck() {</code>
<code> </code><code>// TODO Auto-generated constructor stub</code>
<code> </code><code>public</code> <code>abstract</code> <code>void</code> <code>display();</code>
<code> </code><code>public</code> <code>void</code> <code>performFly() {</code>
<code> </code><code>flyBehavior.fly();</code>
<code> </code><code>public</code> <code>void</code> <code>performQuack() {</code>
<code> </code><code>quackBehavior.quack();</code>
<code> </code><code>public</code> <code>void</code> <code>swim() {</code>
<code> </code><code>System.out.println(</code><code>"All ducks float,even decoys!!"</code><code>);</code>
綠頭鴨使用Quack類來處理發聲是以當performQuack被調用時,發聲的職責被委托給Quack對象,而我們得到了真正的發聲;使用FlyWithWings作為其FlyBehavior類型
<code>public</code> <code>class</code> <code>MallardDuck </code><code>extends</code> <code>Duck {</code>
<code> </code><code>public</code> <code>MallardDuck() {</code>
<code> </code><code>quackBehavior = </code><code>new</code> <code>Quack();</code>
<code> </code><code>flyBehavior = </code><code>new</code> <code>FlyWithWings();</code>
<code> </code><code>public</code> <code>void</code> <code>display() {</code>
<code> </code><code>System.out.println(</code><code>"I'm a real Mallard duck!"</code><code>);</code>
測試類:
<code>public</code> <code>class</code> <code>TEST_Main {</code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) {</code>
<code> </code><code>Duck mallardDuck = </code><code>new</code> <code>MallardDuck();</code>
<code> </code><code>mallardDuck.performFly();</code>
<code> </code><code>mallardDuck.performQuack();</code>
<code>/*輸出結果....................</code>
<code> </code><code>I'm flying!!</code>
<code> </code><code>Quack</code>
<code>*/</code>
動态設定行為
在鴨子裡建立了一堆動态的功能沒有用到,就太可惜了!假設在Duck類中通過“設定方法(setter method)”來設定鴨子的行為,而不是在鴨子的構造器内執行個體化。
在Duck類中,加入兩個新方法:
<code>public</code> <code>void</code> <code>setFlyBehavior(FlyBehavior fb) {</code>
<code> </code><code>flyBehavior = fb;</code>
<code>public</code> <code>void</code> <code>setQuackBehavior(QuackBehavior qb) {</code>
<code> </code><code>quackBehavior = qb;</code>
在運作時想改變鴨子的行為,隻需調用鴨子的setter方法就可以。
本文轉自 ponpon_ 51CTO部落格,原文連結:http://blog.51cto.com/liuxp0827/1351909,如需轉載請自行聯系原作者