设计原则:
找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。如果每次新的需求一来,都会是某方面的代码发生变化,那么这部分的代码需要被抽出来,和其他稳定的代码有所区分。
另一种思考方式:把会变化的部分取出并封装起来,以便以后轻易地改动或扩充此部分,而不影响不需要变化的其他部分。
针对接口编程,而不是针对实现编程。针对接口编程真正的意思是“针对超类型(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,如需转载请自行联系原作者