“如果我是诸葛亮” —— 策略模式
大家好,我是
方圆
,本篇博客主要参考《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吧~
“如果我是诸葛亮” —— 策略模式相关推荐
- 设计模式:策略模式(C++)【诸葛亮的锦囊妙计】
序言 今天带领大家一起来学习下策略模式,看到策略二字,就让笔者想到了谋略,想到了三国,那个谋士如云.英雄辈出的年代.遥想公瑾当年,小乔初嫁了,雄姿英发.咳咳,扯回来.我们所说的策略 ,从字面意思就是一 ...
- 从诸葛亮的三个锦囊妙计谈策略模式
从诸葛亮的三个锦囊妙计谈策略模式 话说当年东吴孙权为刘备借走了荆州不还而耿耿于怀,却不料甘夫人去世,周郎顿时计上心来,让孙权将其妹嫁与刘备,骗刘备来东吴完婚.刘备又不是傻子,当然知道其中的猫腻,当即表 ...
- 来看看如何使用策略模式干掉讨厌的 if else
干掉if else常用策略模式!其实就是抽取一个抽象类,然后根据类型指定不同的实现类执行方法.你学废了吗? 需求 这里虚拟一个业务需求,让大家容易理解.假设有一个订单系统,里面的一个功能是根据订单的不 ...
- java设计模式---策略模式
1,什么是策略模式? 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 2,策略模式有什么好处? 策略模式的好处在于你可以动态的改变对象 ...
- 从零开始单排学设计模式「策略模式」黑铁 II
阅读本文大概需要 1.7 分钟. 本篇是设计模式系列的第三篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统.所以现在打算重写,加上距离现在也有一段时间了, ...
- 项目问题思考之策略模式
2019独角兽企业重金招聘Python工程师标准>>> 需求: 项目中一个模块需要支持对图片,PDF,文本文件的操作,需要读取他们的内容在前台显示,显示缩略图,保存他们的内容到后台, ...
- Pattern-No.03 设计模式之策略模式
2019独角兽企业重金招聘Python工程师标准>>> 1.策略模式定义:定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户之外 2.策略模式 ...
- 设计模式(一)————策略模式(张三的故事??)
引言 当我们完成一个复杂的业务中常常会面临一个问题:针对一个对象的某个行为,不同的情境下有不同的处理方式: 就比如今天我要去上班,那么我需要以哪种交通方式去上班呢?可以有下面几种选择: 步行 公交 地 ...
- 一起学设计模式-策略模式
一.模式介绍 策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换. 策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy). 策略 ...
最新文章
- am5718_AM5718如何扩大内存 - Sitara™ Cortex-A8 和 ARM9 微处理器 - Sitara™ Cortex-A8 和 ARM9 微处理器 - E2E™ 中文支持论坛...
- 全局拖拽上传文件(类似百度网盘)的实现及踩坑
- Gtk+2 Hello World:从源码到打包发布
- 远程导入mysql_mysql导入sql文件命令和mysql远程登陆使用详解
- vtk读取文件并显示的几种方法
- 关于微信公众号小程序在运营过程中的注意事项
- 让ubuntu开机快一点:记开机出现Waiting for network configuration...
- 为什么我们选择 Flutter 开发移动应用?
- vue 绑定背景图片、图片
- java贪吃蛇总结报告_java贪吃蛇开发总结
- 奇迹mu 服务器状态,奇迹mu服务端的架设
- 色彩搭配方案与其特性描述
- java syn包_TCP攻击之SYN攻击
- 计算机网络物理层之信道与信道容量
- android 投屏 app 三星,App Store 上的“爱缤投屏-用于三星智能电视”
- 15数字华容道解法 图解_数字华容道攻略(数字华容道最快解法图)
- java EE技术体系——CLF平台API开发注意事项(4)——API生命周期治理简单说明
- 巧妙隐藏Word文档中指定文字内容
- 计算机技术在法学方面的应用,现代计算机技术为法学带来了什么-西安交通大学教师个人主页.PDF...
- 微信小程序的登录界面实现