设计模式-策略模式(strategy pattern)

需求描述:

  1. 鸭子类(duck)
  2. 多个品种的鸭子(红头鸭,绿毛鸭,玩具鸭)
  3. 多种行为动作(呱呱叫,飞翔,外观展示)

如何设计呢?

普通的设计模式:

  1. duck为父类,定义了呱呱叫 飞翔 外观展示等方法
public class Duck {
    public String guagua(){
        //呱呱叫
    }
    public String fly(){
        //飞翔
    }
    public String display(){
        //外观展示
    }
}
  1. 多个品种的鸭子 设计为子类 继承 duck
public class RedHeadDuck extend Duck{
    //覆写父类的外观方法
    public String display(){
        //我是红头鸭
    }
}

这么设计问题出现了,所有的鸭子都具有了飞翔和呱呱叫的能力,但是玩具鸭并不具有飞翔的能力

修改设计:

  1. duck仍为父类
public class Duck {
    public String guagua(){
        //呱呱叫
    }
    public String display(){
        //外观展示
    }
}
  1. 设计接口 flyBehavior
public interface FlyBehavior {
    Stirng fly();
}
public class FlyDuck extend Duck implements FlyBehavior {
    public String fly(){
        //我会飞翔
    }
}
public class ToyDuck extend Duck {
    public String display() {
        //我是一个玩具鸭
    }
}

将需要实现飞翔的子类实现接口flyBehavior
这样只需要玩具鸭不去实现接口就解决了飞翔的问题

但是 问题来了 如果说飞翔又分为 借力飞翔 迎风飞翔 等不同的飞翔方式
实现接口的子类需要 不同的实现方式,代码更多 而且不能够复用

升级设计

  1. duck为父类
  2. 设计接口 flyBehavior
  3. 设计行为类 实现 flyBehavior
  4. duck 中引用 行为类
public class Duck {
    private FlyBehavior flyBehavior;
    public setFlyBehavior(FlyBehavior f){
        this.flyBehavior = f;
    }
    public String fly(){
        return flyBehavior.fly();
    }
}
public class NoFly implements FlyBehavior {
    public String fly () {
        //不能飞翔
    }
}
public class CanFly implements FlyBehavior {
    public String fly () {
        //可以飞翔
    }
}
//还可以定义多种飞翔方式。。。。

这样设计就可以很灵活的修改类

结语:策略模式(strategy pattern)
将行为类 即易改变的东西抽取出来
多用组合 少用继承
针对接口编程 不要针对实现编程
原文地址 文章参考《head first 设计模式》 未经作者允许 请勿转载,谢谢 :)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 注:本文中的 引用实例 皆为引用《您的设计模式》上实例 策略模式 1、什么是策略模式?第一点:定义一系列算法第二点...
    Flonger阅读 448评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,973评论 19 139
  • 设计模式 开题先说明一下,设计模式告诉我们如何组织类和对象以解决某种问题。让代码变得更加优雅是我们责无旁贷的任务 ...
    tanghuailong阅读 463评论 0 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • 前言 想必大家都有走过流程,流程或大或小,比如有些公司用钉钉走请假流程,你请假,需要填审批人,首先是你的项目组长,...
    狗蛋哥阅读 717评论 0 5