设计模式系列(二) ——策略模式

策略模式

  • 策略模式概要
    • 策略模式定义
    • 策略模式结构
  • 鸭子模型引入
    • 提出需求
    • 解决方案之——使用继承
    • 解决方案之——使用接口
    • 解决方案之——策略模式
  • 总结
    • 策略模式涉及的设计原则
    • 策略模式优缺点

策略模式概要

策略模式定义

什么是策略模式?先看下《 Head First 》一书中的定义:
在这里插入图片描述
从定义来看,说的过于抽象,可能会一头雾水,不明白策略模式到底是个啥东西,实际上"策略"二字古已有之,在古代中又称“计策”,“计谋”,简单点说就是指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法,说白了就是解决同一问题的不同解决办法。

我们举2个贴近生活的栗子:

比如:你准备洗衣服,可以机洗,可以手洗,也可以送洗衣店干洗,每一种都是洗衣服的策略,目的都是实现洗衣的行为。

再比如:某品牌店卖衣服,可以满200减30,可以打7折,也可以买两件送赠品,这每一种都是销售策略,目的都是实现售出衣服的行为。

以上两个栗子中的洗衣服和卖衣服就是人对衣服对象施行的行为,各种洗衣服和卖衣服的方法就是策略模式定义中所谓的算法族。

策略模式结构

策略模式属于行为型模式。

行为型模式又分为行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分派行为。

策略模式就属于后者,读者在此有个了解即可,后面看完整个栗子再回头来看这段内容就会有更深入的理解。

来看下策略模式的UML图:
设计模式系列(二) ——策略模式_第1张图片

这里我假设你已了解类之间的关系及在UML图中的具体表示,如果不了解,请参考: 类之间的关系及表示方法

这个模式涉及三个角色:

  • 环境角色Context:上下文对象,且持有一个或多个行为对象的引用。

  • 抽象策略角色Behavior:这是一个抽象角色,通常由一个接口实现,此角色给出所有的具体策略类所需的接口。

  • 具体策略角色ConcreteStrategy:包装了相关的算法或行为,是策略/行为的具体实现类. 可以有多个,并且可以互相替换。

三个角色分别对应栗子中: 衣服,洗/卖,干洗/手洗/机洗/打7折等。

鸭子模型引入

现在来看下策略模式在具体案例中如何运用,如何解决问题,又带来了哪些优点与弊端。

现有一个鸭子游戏应用
V1.0的版本已具备的功能如下:
鸭子种类:红头鸭(RedHeadDuck)、绿头鸭(MallardDuck),橡皮鸭(RubberDuck)
鸭子行为:游泳(swim)、呱呱叫(quack),呈现不同外观(display)

注:各种鸭子拥有的行为:
所有鸭子: 游泳
橡皮假鸭(RubberDuck): 吱吱叫
绿头鸭(MallardDuck): 飞、呱呱叫
红头鸭(RedHeadDuck):飞、呱呱叫
诱饵鸭(DecoyDuck): 不会飞也不会叫

为了更直观清晰的表现类之间的关系,我们画出UML图如下:
设计模式系列(二) ——策略模式_第2张图片
部分代码展示如下:
鸭子超类Duck:


public abstract class Duck {
   

    /**
     * 描述鸭子外观的方法
     */
    public abstract void display();


    /**
     * 实现鸭子呱呱叫行为
     */
    public void quack(){
   
        System.out.println("呱呱叫...");
    }

    /**
     * 实现鸭子游泳行为
     */
    public void swim(){
   
        System.out.p

你可能感兴趣的:(设计模式,java,设计模式)