设计模式——策略模式

策略模式(the story of the duck)

问题引入

  • 有一群小鸭子,我们需要使用高级语言来完成对他们的行为的描述。
  • 那么首先想到的就是,我们可以抽象不同鸭子的行为,比如fly、quack等行为,于是乎我们得到了abstract class Duck
public abstract class Duck {
    public abstract void display();
    public abstract void performFly();
    public abstract void performQuack();
}
  • 但是同时我们也遇到了一些新的问题,如果有很多的不同的鸭子我们显然是需要分别继承这个Duck的抽象类,然后分别实现其中的抽象方法。假如这个时候我们的小鸭子出现了一种新的功能,或者说某些小鸭子不具有某些功能,那么这个时候继承就有些局限性了。

解决方法

  • 策略模式建议找出负责用许多不同方式完成特定任务的类, 然后将其中的算法抽取到一组被称为策略的独立类中。
  • 因此我们可以找到负责fly的类和负责quack的类,等等这些完成鸭子行为表现的类。
  • 名为上下文的原始类必须包含一个成员变量来存储对于每种策略的引用。 上下文并不执行任务, 而是将工作委派给已连接的策略对象。
  • 这里的上下文类对应的也就是我们的Duck抽象类,将这些完成鸭子行为的类组合在duck抽象类当中。

java代码实例

目录结构

在这里插入图片描述

  • BehaviorInterfaces包当中包含行为的接口,例如fly、quck等
  • BehaviorImpl包当中包含具体的策略类,也就是实现BehaviorInterface的类,完成对鸭子各个行为的描述。

源代码

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

    public abstract void display();

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

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

    protected void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    protected void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }
}
public class MallardDuck extends Duck {

    public MallardDuck() {
        this.setQuackBehavior(new Quack());
        this.setFlyBehavior(new FlyWithWings());
    }

    @Override
    public void display() {
        System.out.println("I'm a real Mallard Duck.");
    }
}
  • 于是乎我们就可以在MallardDuck的构造方法当中对小鸭子的行为进行组合。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值