HeadFirst设计模式学习笔记((JAVA版)鸭子与策略(Strategy)模式

HeadFirst设计模式学习笔记((JAVA版)鸭子与策略(Strategy)模式

原文转自:http://www.cnblogs.com/nokiaguy/archive/2009/02/11/1388168.html

策略模式的设计原则如下:

1. 将应用中需要经常变化的代码独立出来,应和那些不需要经常变化的代码分开。

2. 应针对接口,而不是类进行编程。

3. 在类中应多用组合,少用继承。

例子:

我们要实现一个鸭子模拟器,这个鸭子模拟器由Duck类描述,而Duck类有如下4个行为:

1. display

2. swim

3. fly(飞)

4. quack(叫)

其中swim是所有鸭子都具有的特性,而且所有鸭子的这些特性都相同,因此,这个方法可以直接在Duck类中实现。display方法也是所有鸭子具有的特性,但随着鸭子的种类不同,display也有所不同,因此,display方法应为Duck类的抽象方法。fly和quack并不是所有鸭子的特性,如橡皮鸭子即不会飞,也不会叫。因此,可以将这两个方法看作是两个行为,可将每一个行为设计成一个接口。这样可以和Duck类完全脱离。因为,fly和quack与Duck一点关系都没有(别的东西也可能fly和quack),然后不同的fly和quack分别用实现相应接口的类表示。

下面是关于Duck的完整代码:

fly行为
[code] // 飞行接口
public interface FlyBehavior {
public void fly();
}
// 飞
public class FlyWithWings implements FlyBehavior {
public void fly() {
System.out.println("正在用翅膀飞行");
}
}
// 不飞
public class FlyNoWay implements FlyBehavior {
public void fly() {
System.out.println("不会飞");
}
}
//坐火箭飞
public class FlyRocketPowered implements FlyBehavior {
public void fly() {
System.out.println("坐火箭飞");
}
}

[/code]

quack行为
[code] // 叫接口
public interface QuackBehavior {
public void quack();
}
// 嘎嘎叫
public class Quack implements QuackBehavior {
public void quack() {
System.out.println("嘎嘎叫");
}
}
// 吱吱叫
public class Squeak implements QuackBehavior {
public void quack() {
System.out.println("吱吱叫");
}
}
// 不叫
public class MuteQuack implements QuackBehavior {
public void quack() {
System.out.println("不会叫");
}
}[/code]

实现Duck类
[code]// 鸭子超类
public abstract class Duck {
// 默认的行为
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;

public Duck() {
}

public void setFlyBehavior (FlyBehavior fb) {
flyBehavior = fb;
}

public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}

abstract void display();

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

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

public void swim() {
System.out.println("正在游泳~~");
}
}

[/code]

建立不同的鸭子类

[code] // 野鸭
public class MallardDuck extends Duck {

public MallardDuck() {

quackBehavior = new Quack();
flyBehavior = new FlyWithWings();


}

public void display() {
System.out.println("绿头鸭");
}
}
// 红头鸭
public class RedHeadDuck extends Duck {

public RedHeadDuck() {
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}

public void display() {
System.out.println("红头鸭");
}
}
// 橡皮鸭
public class RubberDuck extends Duck {

public RubberDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Squeak();
}

public void display() {
System.out.println("橡皮鸭");
}
}
//模型鸭
public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}

public void display() {
System.out.println("模型鸭");
}
}
[/code]

[img]/upload/attachment/94178/e70001a3-6dc5-31bf-9060-902ec3ec8852.jpg[/img]


调用代码如下:
[code]public class MiniDuckSimulator {

public static void main(String[] args) {

MallardDuck mallard = new MallardDuck();
RubberDuck rubberDuckie = new RubberDuck();
RedHeadDuck redHeadDuck = new RedHeadDuck();

ModelDuck model = new ModelDuck();

mallard.performQuack();
rubberDuckie.performQuack();
redHeadDuck.performQuack();

model.performFly();
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}
[/code]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值