posts - 310, comments - 6939, trackbacks - 0, articles - 3
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

【Head First设计模式】-Strategy模式

Posted on 2008-01-10 10:33 诗特林 阅读(2822) 评论(2)  编辑  收藏 所属分类: DesignPattern
 

Head First设计模式】-Strategy模式

  

一、从订餐开始

小王和小刘两人到餐厅点餐,两人分别如下告诉厨师。

小王:我要一杯加了香草冰淇淋的巧克力汽水。

小刘:一个黑与白。

       这两人点的餐有什么不同呢?其实是一样的,都是同一份。只是小刘用专业的名字说来出,厨师一听就明白。但小王没有,他不懂,因此他与厨师之间没有“共享的词汇”。共享的词汇不仅方便顾客点餐,也让厨师不用记太多的事。

       设计模式就是让我们与其它的开发人员之间的共享词汇,一旦懂得这些共享词汇,和其它开发人员之间的沟通就容易很多。也让那些不懂设计模式的程序开始学习模式。设计模式可以把思考架构的层次提高到模式层面,而不仅仅停留在琐碎的对象上。

 

二、Strategy模式

 

1、两大原则

 

设计模式真正体现的是Java的原则,而这些原则又通过这些优秀的模式反映出来。有些面向对象的原则,适用于所有的模式,当无法找到适当的模式解决问题时,这些原则就是唯一的标准了。Strategy模式体现了如下的两大原则:

l         针对接口编程,而不是针对实现编程。

l         多用组合,少用继承。

 

2.传统设计


 

 

3.strategy设计


 

三、代码实现

 

1.抽象类Duck.java

package com.sterning.ch1_strategy;

import com.sterning.ch1_strategy.behavior.FlyBehavior;
import com.sterning.ch1_strategy.behavior.QuackBehavior;

public abstract class Duck 
{
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;
    
    
public void setFlyBehavior(FlyBehavior flyBehavior) 
{
        
this.flyBehavior 
= flyBehavior;
    }


    public
 void setQuackBehavior(QuackBehavior quackBehavior) {
        
this.quackBehavior 
= quackBehavior;
    }


    public
 Duck(){
        
    }

    
    public
 abstract void display();
    
    
public void performFly()
{
        flyBehavior.fly();
    }

    
    public
 void performQuack(){
        quackBehavior.quack();
    }

    
    public
 void swim(){
        System.out.println(
"All ducks float,even decoys!
");
    }

}


 

2.行为封装类

 

1)接口

接口FlyBehavior.java

package com.sterning.ch1_strategy.behavior;

public interface FlyBehavior {
    
public void fly();
}


 

接口FlyBehavior.java

package com.sterning.ch1_strategy.behavior;

public interface QuackBehavior {
    
public void quack();
}

 

 

2)实现

 

FlyNoWay.java

package com.sterning.ch1_strategy.behavior.impl;

import com.sterning.ch1_strategy.behavior.FlyBehavior;

public class FlyNoWay implements FlyBehavior {

    
public void fly() {
        System.out.println(
"I can't fly!");
    }


}


 

FlyRocketPowered.java

package com.sterning.ch1_strategy.behavior.impl;

import com.sterning.ch1_strategy.behavior.FlyBehavior;

public class FlyRocketPowered implements FlyBehavior {

    
public void fly() {
        System.out.println(
"I'm flying with a rocket!");
    }


}


 

FlyWithWings.java

package com.sterning.ch1_strategy.behavior.impl;

import com.sterning.ch1_strategy.behavior.FlyBehavior;

public class FlyWithWings implements FlyBehavior {

    
public void fly() {
        System.out.println(
"I am flying!");
    }


}


 

MuteQuack.java

package com.sterning.ch1_strategy.behavior.impl;

import com.sterning.ch1_strategy.behavior.QuackBehavior;

public class MuteQuack implements QuackBehavior {

    
public void quack() {
        System.out.println(
"Silence");
    }


}


 

Quack.java

package com.sterning.ch1_strategy.behavior.impl;

import com.sterning.ch1_strategy.behavior.QuackBehavior;


public class Quack implements QuackBehavior {

    
public void quack() {
        System.out.println(
"Quack");
    }


}


 

Squeak.java

package com.sterning.ch1_strategy.behavior.impl;

import com.sterning.ch1_strategy.behavior.QuackBehavior;

public class Squeak implements QuackBehavior {

    
public void quack() {
        System.out.println(
"Squeak");
    }


}


 

3.实现类

MallardDuck.java

package com.sterning.ch1_strategy;

import com.sterning.ch1_strategy.behavior.impl.FlyWithWings;
import com.sterning.ch1_strategy.behavior.impl.Quack;

public class MallardDuck extends Duck {
    
    
public MallardDuck(){
        quackBehavior
=new Quack();
        flyBehavior
=new FlyWithWings();
    }

    
    @Override
    
public void display() {
        System.out.println(
"I'm a real Mallard Duck");
    }


}

 

ModelDuck.java

package com.sterning.ch1_strategy;

import com.sterning.ch1_strategy.behavior.impl.FlyNoWay;
import com.sterning.ch1_strategy.behavior.impl.Quack;


public class ModelDuck extends Duck {
    
    
public ModelDuck(){
        flyBehavior
=new FlyNoWay();
        quackBehavior
=new Quack();
    }

    
    @Override
    
public void display() {
        System.out.println(
"I'm a model duck");
    }


}

 

4.测试类

MiniDuckSimulator.java

package com.sterning.ch1_strategy.test;

import com.sterning.ch1_strategy.Duck;
import com.sterning.ch1_strategy.MallardDuck;
import com.sterning.ch1_strategy.behavior.impl.FlyRocketPowered;

public class MiniDuckSimulator {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        Duck mallard
=new MallardDuck();
        mallard.performFly();
        mallard.performQuack();
        
        mallard.setFlyBehavior(
new FlyRocketPowered());
        mallard.performFly();
        
    }


}


源代码下载:DesignPattern_ch1_strategy.rar

评论

# re: 【Head First设计模式】-Strategy模式  回复  更多评论   

2008-01-15 12:11 by fantasybei
不错,也正在看这本书,呵呵,有空交流下

# re: 【Head First设计模式】-Strategy模式  回复  更多评论   

2008-07-01 16:42 by Raul Gong
这本书不错,我正准备到网上买一本。
这段时间看设计模式,看的《敏捷开发,原则,模式,与实践》,写得挺好,也是获jolt大奖的,但里面的例子大量使用c++,让我这个搞java的看起来有点头痛,所以希望head first不要辜负我的期望了。

只有注册用户登录后才能发表评论。


网站导航: