大家好,我是方圆,本篇博客主要参考《Head First 设计模式》

目录

  • 1. 我遇到了一个问题
    • 1.1 我要让它怎么实现飞起来呢?
    • 1.2 我想到了解决办法
    • 1.3 将这种方法进行实现
  • 2. 策略模式

1. 我遇到了一个问题

我有一只小鸭子,每天就知道嘎嘎叫,我觉得很无聊,我想让它学学飞,以下是对我的鸭子的描述

public class RealDuck extends Duck {@Overridepublic void quack() {super.quack();}
}

我们也顺便看以下,它继承的基类Duck

public abstract class Duck {public void quack(){System.out.println("嘎嘎嘎");}}

1.1 我要让它怎么实现飞起来呢?

  • 首先,我想到了!我直接在基类Duck里写一个飞的方法不就好了吗?简单!
public abstract class Duck {public void quack(){System.out.println("嘎嘎嘎");}public void fly(){System.out.println("我学会飞啦!");}
}

简单测试一下

public class Test {public static void main(String[] args) {Duck myDuck = new RealDuck();myDuck.quack();myDuck.fly();}
}


很好,问题貌似解决了,但是,我看见了玩具鸭子也飞了起来

public class Test {public static void main(String[] args) {Duck myDuck = new RealDuck();myDuck.quack();myDuck.fly();System.out.println("玩具鸭 ↓");Duck toyDuck = new ToyDuck();toyDuck.fly();}
}


这下可咋好?玩具鸭也飞起来了,那我在玩具鸭里把这个fly方法重写一下吧,这就解决了

public class ToyDuck extends Duck {@Overridepublic void fly() {System.out.println("我是玩具鸭,我不会飞");}
}

但是回过头来,想想,我不光只有玩具鸭啊,我还有宠物鸭,唐老鸭,小黄鸭等等,很多鸭子都不会飞,每个类都要重写一下,岂不是很麻烦吗?而且代码很多都是重复的,这个问题怎么解决呀?

1.2 我想到了解决办法

  • 设计原则:将应用中可能需要变化的部分,独立出来,不要和那些不变的代码混在一起。

那我们,把fiy()这个方法拿出来吧,但是要怎么往外拿呢?我们看一下下一个设计原则

  • 设计原则:针对接口编程,而不是针对实现编程

怎么理解呢,拿鸭子飞这个例子来说,我们把飞定义为FlyBehavior接口,这样用它的实现类实现这个接口,以达到不同的飞的方式(会飞与不会飞),理解了吗?没有理解正常,我说的不清楚,看下面代码就明白了

public interface FlyBehavior {void fyl();
}public class CanFly implements FlyBehavior {@Overridepublic void fyl() {System.out.println("我能飞");}
}
public class CantFly implements FlyBehavior {@Overridepublic void fyl() {System.out.println("我不会飞哇!");}
}

两个实现类实现了FlyBehavior接口,成就了两种会飞与不会飞的方法,这样,这个飞行的动作就能够让其他的对象复用,因为这些行为已经跟鸭子没有关系了,实现了解耦,就算我们新增别的行为,也不需要修改鸭子的代码。

1.3 将这种方法进行实现

我们在Duck中引入FlyBehavior接口这个实例变量,如下

public abstract class Duck {private FlyBehavior flyBehavior;public void setFlyBehavior(FlyBehavior flyBehavior) {this.flyBehavior = flyBehavior;}public void quack(){System.out.println("嘎嘎嘎");}public void fly(){flyBehavior.fyl();}
}

这样我们就可以,根据不同的鸭子注入不同的行为,实现不同的动作啦,我们试试!

public class Test {public static void main(String[] args) {Duck myDuck = new RealDuck();myDuck.setFlyBehavior(new CanFly());myDuck.fly();System.out.println("玩具鸭 ↓");Duck toyDuck = new ToyDuck();toyDuck.setFlyBehavior(new CantFly());toyDuck.fly();}
}


我们完成了鸭子业务的设计,我们回过头来,俯瞰一下这个大局

这也体现了一种设计原则

  • 设计原则:多用组装,少用继承

等等,听你讲了这么半天?策略模式呢?啊?听了半天鸭子没有设计模式我不干!


等等!放下刀,我这就说,这就说!


2. 策略模式

其实策略模式,已经出现过了,只不过小的没提而已。我们看一眼它的描述,说的是啥?

  • 策略模式:它定义了算法族,分别封装起来,让它们之间可以互换,此模式让算法的变化独立于使用算法的客户端。

明白了吧,好了,收!


好,我接着讲,接着讲昂!

认真看看红框里的东西,比对一下概念,是不是有点儿明白了?
咱说白了,它不就是,不就是能够在行为间不同的切换嘛?
我写写代码你就一下懂了!

写俩新接口实现类

public class FlyStyleOne implements FlyBehavior {@Overridepublic void fyl() {System.out.println("我先慢点儿飞!");}
}
public class FlyStyleTwo implements FlyBehavior {@Overridepublic void fyl() {System.out.println("我再快点儿飞!");}
}

测试一下

public class Test {public static void main(String[] args) {Duck myDuck = new RealDuck();myDuck.setFlyBehavior(new CanFly());myDuck.fly();myDuck.setFlyBehavior(new FlyStyleOne());myDuck.fly();myDuck.setFlyBehavior(new FlyStyleTwo());myDuck.fly();}
}

显示结果

飞的不同的方式,对应的就是不同的算法,我能够把这些算法之间随便换,也就是我的鸭子,随便飞,想咋飞咋飞,换着法儿的飞!这就实现了策略模式。前边的都是铺垫,策略模式就这儿点儿。

Ok,这下行了吧?


看到这里,也奖励一把fafa吧~

“如果我是诸葛亮” —— 策略模式相关推荐

  1. 设计模式:策略模式(C++)【诸葛亮的锦囊妙计】

    序言 今天带领大家一起来学习下策略模式,看到策略二字,就让笔者想到了谋略,想到了三国,那个谋士如云.英雄辈出的年代.遥想公瑾当年,小乔初嫁了,雄姿英发.咳咳,扯回来.我们所说的策略 ,从字面意思就是一 ...

  2. 从诸葛亮的三个锦囊妙计谈策略模式

    从诸葛亮的三个锦囊妙计谈策略模式 话说当年东吴孙权为刘备借走了荆州不还而耿耿于怀,却不料甘夫人去世,周郎顿时计上心来,让孙权将其妹嫁与刘备,骗刘备来东吴完婚.刘备又不是傻子,当然知道其中的猫腻,当即表 ...

  3. 来看看如何使用策略模式干掉讨厌的 if else

    干掉if else常用策略模式!其实就是抽取一个抽象类,然后根据类型指定不同的实现类执行方法.你学废了吗? 需求 这里虚拟一个业务需求,让大家容易理解.假设有一个订单系统,里面的一个功能是根据订单的不 ...

  4. java设计模式---策略模式

    1,什么是策略模式? 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 2,策略模式有什么好处? 策略模式的好处在于你可以动态的改变对象 ...

  5. 从零开始单排学设计模式「策略模式」黑铁 II

    阅读本文大概需要 1.7 分钟. 本篇是设计模式系列的第三篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统.所以现在打算重写,加上距离现在也有一段时间了, ...

  6. 项目问题思考之策略模式

    2019独角兽企业重金招聘Python工程师标准>>> 需求: 项目中一个模块需要支持对图片,PDF,文本文件的操作,需要读取他们的内容在前台显示,显示缩略图,保存他们的内容到后台, ...

  7. Pattern-No.03 设计模式之策略模式

    2019独角兽企业重金招聘Python工程师标准>>> 1.策略模式定义:定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户之外 2.策略模式 ...

  8. 设计模式(一)————策略模式(张三的故事??)

    引言 当我们完成一个复杂的业务中常常会面临一个问题:针对一个对象的某个行为,不同的情境下有不同的处理方式: 就比如今天我要去上班,那么我需要以哪种交通方式去上班呢?可以有下面几种选择: 步行 公交 地 ...

  9. 一起学设计模式-策略模式

    一.模式介绍 策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换. 策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy). 策略 ...

最新文章

  1. am5718_AM5718如何扩大内存 - Sitara™ Cortex-A8 和 ARM9 微处理器 - Sitara™ Cortex-A8 和 ARM9 微处理器 - E2E™ 中文支持论坛...
  2. 全局拖拽上传文件(类似百度网盘)的实现及踩坑
  3. Gtk+2 Hello World:从源码到打包发布
  4. 远程导入mysql_mysql导入sql文件命令和mysql远程登陆使用详解
  5. vtk读取文件并显示的几种方法
  6. 关于微信公众号小程序在运营过程中的注意事项
  7. 让ubuntu开机快一点:记开机出现Waiting for network configuration...
  8. 为什么我们选择 Flutter 开发移动应用?
  9. vue 绑定背景图片、图片
  10. java贪吃蛇总结报告_java贪吃蛇开发总结
  11. 奇迹mu 服务器状态,奇迹mu服务端的架设
  12. 色彩搭配方案与其特性描述
  13. java syn包_TCP攻击之SYN攻击
  14. 计算机网络物理层之信道与信道容量
  15. android 投屏 app 三星,‎App Store 上的“爱缤投屏-用于三星智能电视”
  16. 15数字华容道解法 图解_数字华容道攻略(数字华容道最快解法图)
  17. java EE技术体系——CLF平台API开发注意事项(4)——API生命周期治理简单说明
  18. 巧妙隐藏Word文档中指定文字内容
  19. 计算机技术在法学方面的应用,现代计算机技术为法学带来了什么-西安交通大学教师个人主页.PDF...
  20. 微信小程序的登录界面实现

热门文章

  1. Windows11 Java Path环境变量配置
  2. linux中的make相关用法介绍
  3. 东方通基本命令查询tonglink/q
  4. CyclicBarrier和CountDownLatch使用上的区别
  5. xml文件基本格式与解析(一)
  6. 尚硅谷_HTML5 核心 实战 笔记
  7. 识别非法进程与手工杀毒
  8. 第一周:手写数字识别
  9. 【软件问题】Matlab如何将 cell 转成double
  10. 红信圈是如何重新定义广告传播途径的