2019独角兽企业重金招聘Python工程师标准>>>

面向对象的设计方案

产品狗今天跟你说,要做一个“模拟鸭子游戏”,需求如下:

鸭子有共同的功能,比如游泳和叫。

鸭子也有不同的功能,比如有绿头鸭和红头鸭。

所以想到了通过使用OO的方式,将共同的功能放在抽象类Duck中,而不同的用abstract修饰供子类实现。

public abstract class Duck {public Duck() {}public void Quack() {System.out.println("~~gaga~~");}public abstract void display();//不同样子的鸭子,有不同的实现public void swim() {System.out.println("~~im swim~~");}
}
public class GreenHeadDuck extends Duck {//绿头鸭@Overridepublic void display() {System.out.println("**GreenHead**");}
}
public class RedHeadDuck extends Duck {//红头鸭@Overridepublic void display() {System.out.println("**RedHead**");}
}

通过面向对象的思想,我们实现了复用,完成了需求。


新需求


看看这种设计在增加新功能的时候,其扩展性如何。

新需求:添加会飞的鸭子

public abstract class Duck {//...略...public void Fly() {System.out.println("~~im fly~~");}
}

如果在超类中添加这段代码,那么问题马上就来了,超类中添加的方法对所有之类都生效,而不是所有的鸭子都需要这个功能。

public class GreenHeadDuck extends Duck {//...略...public void Fly() {System.out.println("~~no fly~~");}
}

那我们可以覆盖掉不会飞的鸭子的fly方法,不就可以了吗~~~

问题又来了,如果有10种不会飞的鸭子,岂不是要重复做10次重复性的工作?

那可不可以把超类中的fly方法弄成abstract呢?

这样所有的之类不就都要实现fly方法吗~如果50种鸭子,那就需要实现50次!

如果又有新需求,比如石头鸭子,既不会飞也不会叫 ,如何实现? +_+

看来上述都不是很好的设计方案。


思路


分析软件设计需要考虑两方面的问题

1)分析项目变化和不变的部分,对于变化的部分,抽象成接口+实现;

2)找到那些功能会根据新需求而变化。

这个模拟鸭子的游戏中,鸭子的叫声和飞行方式会变。


策略模式实现

对飞行和叫分别设计接口,对于不同的叫声和飞行再通过实现的方式完成。

public interface FlyBehavior {void fly();
}
public  interface QuackBehavior {void quack();
}

这样新增行为变得很简单,只需要实现相同的接口即可。

在鸭子超类中,通过组合抽象的飞行和抽象的叫声,具体的叫和飞交给之类补充。

import com.java.hexter.stimulateduck.flybehavior.FlyBehavior;
import com.java.hexter.stimulateduck.quackbehavior.QuackBehavior;public abstract class Duck {FlyBehavior mFlyBehavior;QuackBehavior mQuackBehavior;public Duck() {}public void Fly() {mFlyBehavior.fly();}public void Quack() {mQuackBehavior.quack();}public abstract void display();public void SetQuackBehavoir(QuackBehavior qb) {mQuackBehavior = qb;}public void SetFlyBehavoir(FlyBehavior fb) {mFlyBehavior = fb;}public void swim() {System.out.println("~~im swim~~");}
}

看到没有,抽象超类中没有任何具体的实现类耦合,而是通过接口调用。

里面的fly还是quack函数,都是根据之类mFlyBehavior和mQuackBehavior的不同而不同。

看看绿头鸭以及红头鸭的实现过程。

public class GreenHeadDuck extends Duck {public GreenHeadDuck() {mFlyBehavior = new GoodFlyBehavior();mQuackBehavior = new GaGaQuackBehavior();}@Overridepublic void display() {System.out.println("**GreenHead**");}
}public class RedHeadDuck extends Duck {public RedHeadDuck() {mFlyBehavior = new BadFlyBehavior();mQuackBehavior = new GeGeQuackBehavior();}@Overridepublic void display() {System.out.println("**RedHead**");}
}

很强大,又木有~~~ 脑洞打开的赶脚

策略模式:

行为抽象成接口,并且实现算法族,在超类中放行为接口对象,子类里具体设置行为对象。

原则是分离变化部分,封装接口,基于接口编程各种功能,让行为的实现能单独变化。

转载于:https://my.oschina.net/gaohongtian/blog/492113

四、设计模式——策略模式相关推荐

  1. JAVA设计模式-策略模式

    1.1 需求背景 Background:M公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票打折方式,具体打折方案如下: (1)学生凭学生证可享受票价8折优惠: (2 ...

  2. 关于设计模式——策略模式-Strategy Pattern

    文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...

  3. java 策略模式 促销_java设计模式——策略模式

    一. 定义与类型 定义:针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换.策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能.当代码中 ...

  4. 15. 星际争霸之php设计模式--策略模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

  5. 设计模式------策略模式

    策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的用户.何谓算法呢?它是一种描述程序行为的语言,广泛应用于计算机科学领域,是一种让程序最为简洁的思考 ...

  6. Unity 游戏设计模式 — 策略模式(Strategy)

    策略模式(Strategy) 一.使用策略模式的原因 二.策略模式的定义 三.策略模式的使用说明 四.策略模式的实现范例 五.中介者模式的优点和注意事项 六.策略模式的总结 一.使用策略模式的原因 在 ...

  7. Python设计模式-策略模式

    Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...

  8. [设计模式] ------ 策略模式

    策略模式 它定义了算法家族,分别封装起来,让他们直接可以互相替换,此模式让算法的变化,不会影响到使用算法的客户 其实很简单,可能很多人都用到了,只不过还不知道这就是策略模式而已. 比如定义一个接口A, ...

  9. Springboot 使用设计模式- 策略模式

    前言 直白点,什么场景我们需要使用到设计模式- 策略模式. 在平常的springboot项目里面做CRUD,我们的习惯性基本是 一个mapper,一个service,一个serviceImpl. 但是 ...

  10. 李建忠设计模式——策略模式Strategy

    目录 1.策略模式定义 1.动机 2.模式定义 3.结构 2.实现例子 1.问题描述 2.代码实现 3.要点总结 4.参考 1.策略模式定义 1.动机 软件构建过程中,某些对象使用的算法可能多种多样, ...

最新文章

  1. C语言十六进制转换为八进制(附完整源码)
  2. 支付宝异步回调返回success_深入解决异步编程Promise对象的学习
  3. 学成在线--16.添加课程计划
  4. linux内核等价多路径路由,Linux内核分析 - 网络[四]:路由表
  5. matlab两张图片合成一张_两张图片合成一幅画意作品的简单方法
  6. Java类加载原理解析(转)
  7. 30个专业的电子商务网站,助您一臂之力
  8. 微信开发工具调试窗口怎样查看netWork
  9. 知网海外版(硕博论文pdf下载方式)
  10. 实变函数(3)-可测函数
  11. android fragment 白屏,当应用Crash后fragment出现白屏
  12. matlab函数怎么写,matlab怎么写函数
  13. [someip专题]vsomeip使用以及代码解析1
  14. 渲染类博客和游戏相关工作室论文发布地址大集合
  15. 岁末年初,为你打包了一份技术合订本
  16. stay_foolish_stay_hungry(没事多看看)
  17. ole db提供程序 mysql_服务器_SQLServer的链接服务器技术小结,一、使用 Microsoft OLE DB Provider F - phpStudy...
  18. 51、基于51单片机的GPS定位系统(GSM短信)
  19. Python模块管理的入门详解,初学者福利
  20. github中的LICENSE是什么

热门文章

  1. 解决多个pts/*在线登录问题
  2. Apache配置代理服务器的方法(2)
  3. Spring junit测试
  4. ubuntu 下 object-c环境配置与hello world 编译
  5. ASP.NET 4学习笔记(1) SQL注入攻击及解决方案.
  6. ASP.NET页面生命周期描述
  7. OGRE例子:Demo_Ocean 源码解析
  8. 2019.7.9刷题统计
  9. 实验三编程、编译、连接、跟踪
  10. vmware克隆虚拟机