策略模式

  • 都是被产品逼的!
  • 策略模式
  • 策略模式的优点

都是被产品逼的!

目前广为流传的设计模式都是前辈们的重要经验,都是在实践中检验的真理。
鸭子游戏是目前最为广泛的策略模式入门。
为什么说策略模式是被产品逼出来的呢?
需求
鸭子可以有外型(display),可以叫(quack),可以游泳(swim)有各种各样的鸭子, eg:绿头鸭(MallardDuck),红头鸭
(RedHeadDuck),橡皮鸭(RubberDuck)…要求采用OO的设计方式

实现这个需求还是很简单的
一、我们先来一个鸭子父类 里面写抽象方法外型(display)和行为 叫(quack),可以游泳(swim)
二、各种鸭子继承父类
三、实现各自的外形
好了 你需求完成了真棒

产品现在来个另外一个需求 我们要鸭子会飞!
没办法 改呗!
Duck父类继续加入一个飞的行为
完工!下班!

产品又来需求了,不过这次来了个比较奇葩的需求。他说橡皮鸭子不能飞!
啊这!这也简单!
子类中将飞的方法重写不就解决了!

产品又双叒叕来需求了,各种鸭子都来了,能飞不能叫,能叫不能飞,不能叫不能飞等等
真实烦死了!!!!!!!!!
总不能一直修改下去!这样继承的意义何在呢?
改用接口?这样所有的代码都无法复用了!简直就是噩梦!!!

因此前辈们有了前车之鉴!换了一种新的方式来实现次功能!!!

策略模式

以鸭子游戏为例

我们先写一个行为的接口

public interface FlyBav {    public void fly();
}


public interface QuackBav { public void quack();
}

然后实现各种行为
能飞


public class CanFly  implements FlyBav{@Overridepublic void fly() {// TODO 自动生成的方法存根System.out.println("我不能飞!");}}

不能飞

public class CanNotFly implements FlyBav{@Overridepublic void fly() {// TODO 自动生成的方法存根System.out.println("我能飞!");}}

能叫

public class CanQuack implements QuackBav{@Overridepublic void quack() {// TODO 自动生成的方法存根System.out.println("我能叫!");}}

不能叫

public class CanNotQuack implements QuackBav{@Overridepublic void quack() {// TODO 自动生成的方法存根System.out.println("我不能叫!");}}

我们会改变的前置需求解决了

我们来写鸭子的父类
父类里声明会变的行为变量
使用构造函数进行初始化 因此我便无需关系鸭子具体能不能飞能不能叫 一切由需求觉定

public abstract class Duck {//鸭子这两种行为具体是什么我不关心 能不能飞 能不能叫由用户本身决定//飞的行为 private FlyBav flyBav;//叫的行为private QuackBav quackBav;//构造函数 并且不声明无参构造 即使用次对象必须对确定对象是否能飞能叫public Duck(FlyBav flyBav, QuackBav quackBav) {this.flyBav = flyBav;this.quackBav = quackBav;}//子类需要实现dispaly方法public abstract void display();//飞的方法 能不能飞委托给FlyBav 由传入的值确定能不能飞public void fly() {flyBav.fly();}//叫的方法 能不能叫委托给QuackBav 由传入的值确定能不能叫public void quack() {quackBav.quack();}//鸭子游戏public void play() {this.display();this.fly();this.quack();}}

各种鸭子的子类
绿鸭子

public class GreenDuck extends Duck{public GreenDuck(FlyBav flyBav, QuackBav quackBav) {super(flyBav, quackBav);// TODO 自动生成的构造函数存根}@Overridepublic void display() {// TODO 自动生成的方法存根System.out.println("我是一只绿鸭子!");}}

橡皮鸭子

public class RubberDuck extends Duck{public RubberDuck(FlyBav flyBav, QuackBav quackBav) {super(flyBav, quackBav);// TODO 自动生成的构造函数存根}@Overridepublic void display() {// TODO 自动生成的方法存根System.out.println("我是一只橡皮鸭子!");}}

测试类

public class DuckTest {public static void main(String[] args) {GreenDuck greenDuck = new GreenDuck(new CanFly(), new CanQuack());RubberDuck rubberDuck = new RubberDuck(new CanNotFly(), new CanQuack());greenDuck.play();rubberDuck.play();}}


大功告成!

策略模式的优点

那么策略模式有什么优点呢?
别急!
新的需求来了,产品要一个北京烤鸭!不能飞,不能叫!
怎么办?
简单!直接来一个北京烤鸭的子类就解决了!其余代码完全不需要改动!

最大的优点
有新的需求不需要改动原有的代码,因为只要代码改动了何其相关的一切都需要重新测试!不改动原有代码就是很棒的设计!

实现
北京烤鸭 新的需求来了原有代码完全不需要改动

public class BJDuck extends Duck{public BJDuck(FlyBav flyBav, QuackBav quackBav) {super(flyBav, quackBav);// TODO 自动生成的构造函数存根}@Overridepublic void display() {// TODO 自动生成的方法存根System.out.println("我是北京烤鸭!");}}

测试类

public class DuckTest {public static void main(String[] args) {GreenDuck greenDuck = new GreenDuck(new CanFly(), new CanQuack());RubberDuck rubberDuck = new RubberDuck(new CanNotFly(), new CanQuack());BJDuck bjDuck = new BJDuck(new CanNotFly(), new CanNotQuack());greenDuck.play();rubberDuck.play();bjDuck.play();}}

策略模式Java实现相关推荐

  1. [设计模式] - 策略模式(Java篇)

    来源:http://user.qzone.qq.com/31584 (QQ空间) http://b.qzone.qq.com/cgi-bin/blognew/blog_output_data?uin= ...

  2. 策略模式java 用例_java策略模式简单用例

    运用java策略模式一个小程序 /** * */ package Strategy; import java.util.Arrays; /** * @author HuangRong * @Funti ...

  3. 策略模式-Java实现

    策略模式:一个类的行为(或策略)可以在运行时更改. 如对一个数组排序,可以使用不同的排序策略,有选择排序.冒泡排序.快速排序等. 在程序运行过程中,可以根据不同的条件选择相应的排序算法. Java 实 ...

  4. java策略模式(Java策略模式多种返回结果)

    Java设计模式的中介者模式是怎样的? 如果对象之间的关系原本一目了然,中介对象的加入便是"画蛇添足". 来看下中介者模式的组成部分吧. 1) 抽象中介者(Mediator)角色: ...

  5. 设计模式--策略模式--Java实现

    ***策略模式4步走***

  6. Java设计模式之行为型:策略模式

    一.背景: 在开发中经常遇到这种情况,实现某个功能有多种算法策略,我们可以根据不同环境或者条件选择不同的算法策略来完成该功能,比如查找.排序等,一种常用方式是硬编码在一个类中,如需要提供多种查找算法, ...

  7. Strategy策略模式

    策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换.该模式可使得算法能独立于使用它的客户而变化.Strategy模式是行为模式,正因为他是一种行为模式,所以他不是用来解决类的实例化的 ...

  8. 策略模式示例代码_策略设计模式示例

    策略模式示例代码 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的 ...

  9. 设计模式 | 策略模式及典型应用

    本文的主要内容: 介绍策略模式 示例 商场购物打折策略的实现 策略模式总结 源码分析策略模式的典型应用 Java Comparator 中的策略模式 Spring Resource 中的策略模式 Sp ...

  10. Java中的策略模式实例教程

    策略模式是一种行为模式.用于某一个具体的项目有多个可供选择的算法策略,客户端在其运行时根据不同需求决定使用某一具体算法策略. 策略模式也被称作政策模式.实现过程为,首先定义不同的算法策略,然后客户端把 ...

最新文章

  1. Doctype作用? 严格模式与混杂模式如何区分?它们有何意义
  2. WordPress的RSS订阅优化
  3. 基于字典SR各种方法【稀疏编码多种方法】
  4. CSS3新增-属性(长度颜色背景)选择器-盒子模型
  5. flutter 监听返回
  6. 2020魔幻“商战”:抢公章、发黄图、半夜翻工厂...最烂的小说都不敢这么写
  7. 一步一步完成坦克大战:一、游戏关键难点实现
  8. 【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--请求处理函数装饰器注册篇(5/8)【controller+action】...
  9. DOM 元素对象解析
  10. modbus功能码04实例_MODBUS功能码简介
  11. 梅科尔工作室-PR第三次培训笔记(效果与转场及插件使用)
  12. PyQt5项目:网速监控器
  13. 修改android屏幕分辨率
  14. 2014Gartner技术成熟度曲线
  15. 芋道源码 精尽学习指南
  16. 运行TM2009/QQ2009后CPU很忙导致系…
  17. linux 下载jdk方式
  18. 华为鸿蒙手机曝光,华为鸿蒙手机新特性曝光:充电期间系统将进行深度优化
  19. CSDN的第一篇文章——聊聊股市
  20. 微型计算机控制技术:模拟量输入通道 简述题 + ADC接口电路设计分析

热门文章

  1. ES 查询 —— match 和 match_prase
  2. 什么是全屋定制家居概念?
  3. 360路由器虚拟服务器怎么设置,路由器端口映射设置步骤
  4. SFDC 日常经验积累
  5. ssm共享充电宝管理系统计算机毕业设计
  6. Centos 6 yum安装出错
  7. WPF Deactivated和Activated简单使用
  8. ITunes备份的背景知识
  9. 上市公司创新研发支出数据(2006-2018年)
  10. Apple Configurator 2提取ipa文件