`

读head first design pattern之一 策略模式

 
阅读更多
策略模式指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。



以下是书中的一个应用场景。 Joe上班的公司做了一款模拟鸭子的游戏,游戏中出现各种鸭子,一边游泳一边呱呱叫。系统原来按照OO标准用了一个超类Duck,让各种鸭子继承此超类。 差不多像这样

很快问题来了,主管在给股东们演示的时候,出现了很多橡皮鸭子在屏幕上飞来飞去。。。 这次Joe学会了举一反二,子类覆写超类的方法?不行,如果加入诱饵鸭,既不会飞也不会叫~ 嗯,可以利用接口,将功能标识为接口,需要的类自己实现接口方法。


又被主管发现问题了:当飞行的动作变化,所有的子类都要修改。。。 该策略模式出场了;既然变化的是鸭子的行为,那就把行为和鸭子本身分离出来
思路明确了,实现起来就顺利多了
public interface FlyBehavior {
	public void fly();
}

public interface QuackBehavior {
	public void quack();
}

public class FlyWithSwing implements FlyBehavior {

	public void fly() {
		System.out.println("fly with swing");
	}
}

public class Squack implements QuackBehavior {

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


public class MallardDuck extends Duck {

	@Override
	public void diaplay() {
		System.out.println("I am MallardDuck ");
	}
}

/**
 * @author Admin
 * @create date 2013-8-20
 */

public abstract class Duck {
	private FlyBehavior flyBehavior;
	private QuackBehavior quackBehavior;

	public void fly() {
		flyBehavior.fly();
	}

	public void quack() {
		quackBehavior.quack();
	}
	
	public abstract void diaplay();
	
	public static void main(String[] args) {
		Duck mallardDuck = new MallardDuck();
		FlyBehavior flyWithSwing = new FlyWithSwing();
		QuackBehavior quack = new Squack();

		mallardDuck.setFlyBehavior(flyWithSwing);
		mallardDuck.setQuackBehavior(quack);

		Duck rubberDuck = new RubberDuck();
		FlyBehavior flyNoWay = new FlyNoWay();
		QuackBehavior muteQuack = new MuteQuack();

		rubberDuck.setFlyBehavior(flyNoWay);
		rubberDuck.setQuackBehavior(muteQuack);

		mallardDuck.diaplay();
		mallardDuck.quack();
		mallardDuck.fly();
	}
	/**
	 * @param flyBehavior
	 *            the flyBehavior to set
	 */
	public void setFlyBehavior(FlyBehavior flyBehavior) {
		this.flyBehavior = flyBehavior;
	}
        ......
}
  • 大小: 39.3 KB
  • 大小: 41.8 KB
  • 大小: 41.7 KB
  • 大小: 114.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics