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

 

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

你可能感兴趣的:(【Head First设计模式】-Strategy模式)