天天看点

java 设计模式 学习笔记(一)

设计原则:

       找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。如果每次新的需求一来,都会是某方面的代码发生变化,那么这部分的代码需要被抽出来,和其他稳定的代码有所区分。

   另一种思考方式:把会变化的部分取出并封装起来,以便以后轻易地改动或扩充此部分,而不影响不需要变化的其他部分。

   针对接口编程,而不是针对实现编程。针对接口编程真正的意思是“针对超类型(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>"&lt;&lt; Silence &gt;&gt;"</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,如需转载请自行联系原作者