策略模式

文章说明

  • 该文章为《Head First 设计模式》的学习笔记
  • 非常推荐大家去买一本《Head First 设计模式》去看看,节奏轻松愉悦,讲得通俗易懂,非常适合想要学习、了解、应用设计模式以及OO1设计原则的小白。

提出问题

  • Joe做了一款模拟鸭子的游戏:SimDuck
  • 游戏中会出现各种的鸭子,一边游水戏水,一边呱呱叫。(此系统内部设计使用了标准的OO1技术,设计了一个鸭子超类,并让各种鸭子继承此超类)
  • 假如接下来模拟程序需要会飞的鸭子,不同叫法的鸭子。
  • 怎么样的设计才能建立可复用性可扩展性可维护性的系统呢?

模式的定义

定义了算法蔟,分别封装起来,让他们之间互相替换,此模型让算法的变化独立于使用算法的客户。

涉及的OO1设计原则

  • 封装变化
  • 多用组合,少用继承
  • 针对接口编程,不针对实现编程

类图

«abstract» Duck FlyBehavior fb QuackBehavior qb dispaly() performFly() performQuack() setFlyBehavior(FlyBehavior fb) setQuackBehavior(QuackBehavior qb) MallardDuck dispaly(/*绿头鸭*/) RedheadDuck display(/*红头鸭*/) RubberDuck display(/*橡皮鸭*/) DecoyDuck display(/*诱饵鸭*/) «interface» FlyBehavior fly() «interface» QuackBehavior quack() FlyWithWings fly(/*鸭子飞*/) FlyNoWay fly(/*啥也不做*/) Quack quack(/*呱呱叫*/) Squeak quack(/*叽叽叫*/) MuteQuack quack(/*不叫*/) has-a has-a

代码的部分展示

名为鸭子的抽象父类 Duck

public abstract class Duck {
	// 代理实现Duck的飞行和叫声行为
	protected FlyBehavior flyBehavior;
	protected QuackBehavior quackBehavior;
	Duck() {}
	public abstract void display();
	// 不需要覆盖重写 
	public void performFly() {
		flyBehavior.fly();
	}
	public void performQuack() {
		quackBehavior.quack();
	}
	// 提供动态设置鸭子行为的功能:
	public void setFlyBehavior(FlyBehavior flyBehavior) {
		this.flyBehavior = flyBehavior;
	}
	public void setQuackBehavior(QuackBehavior quackBehavior) {
		this.quackBehavior = quackBehavior;
	}
}

鸭子叫和飞的行为委托给接口 FlyBehavior QuackBehavior的实现类去执行:

public interface FlyBehavior {
	void fly();
}
-------------------------------
public interface QuackBehavior {
	void quack();
}

  1. object-oriented 面向对象 ↩︎ ↩︎ ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值