博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-策略模式(strategy pattern)
阅读量:6446 次
发布时间:2019-06-23

本文共 1451 字,大约阅读时间需要 4 分钟。

需求描述:

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

如何设计呢?

普通的设计模式:

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

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

修改设计:

  1. duck仍为父类
    public class Duck { public String guagua(){     //呱呱叫 } public String display(){     //外观展示 }}复制代码
  2. 设计接口 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 设计模式》
未经作者允许 请勿转载,谢谢 :)

转载于:https://juejin.im/post/58d68f15ac502e0058cdad6c

你可能感兴趣的文章
nginx upstream的五种分配方式
查看>>
net.reflector8.5.0.179过了试用期,要求输入序列号怎么办 注册机 破解
查看>>
【SSH异常】InvalidDataAccessApiUsageException异常
查看>>
013 集合
查看>>
逻辑回归原理介绍及Matlab实现
查看>>
git相关知识:如何避免某些文件无需提交
查看>>
Java中Comparable和Comparator区别小结
查看>>
派发机制、动态绑定、静态绑定
查看>>
单节点k8s的一个小例子 webapp+mysql
查看>>
基于tiny4412的Linux内核移植 -- 设备树的展开【转】
查看>>
[转]How to Send Ethereum with Web3.js and Node
查看>>
Java高级个人笔记(RandomStringUtils工具类)
查看>>
FakeUserAgentError('Maximum amount of retries reached') 彻底解决办法
查看>>
[Web 前端] 我不再使用React.setState的3个原因
查看>>
Java队列Queue
查看>>
从软件到片源!PC播放HDTV上手全攻略
查看>>
PowerShell入门(四):如何高效地使用交互式运行环境?
查看>>
linux mount
查看>>
Providesfactories类的应用(转)
查看>>
通过QC远程运行QTP脚本,QTP自动崩溃关闭的解决方法
查看>>