设计模式1(策略模式)
设计模式原则
- 不变的和变化的分开。
- 针对接口编程,而不针对实现编程。
- 多考虑组合,而不是继承。
策略模式
定义算法族,分别封装,使之可以相互替换,此模式让算法的变化独立于使用算法的客户。
例
最典型的鸭子问题
比如:鸭子是一类,有普通鸭子,模型鸭子,野鸭等,按照设计模式的第一个原则来考虑,那么鸭子时不变的,变化的是鸭子的一些行为比如叫,飞,速度等等。
这样的话我们就需要有一个不变的类:鸭子类,和一些变化的类:飞,叫,所以我们的飞和叫不加在鸭子的类中
但是所有的鸭子都会有一定的外观,展示出来;
鸭子类
public class Duck{public abstract void display();
}
根据第二个原则我们要针对接口,而不针对实现,那么我们飞和叫就要,并应该放在接口中;
飞
public interface FlyBehavior {public void fly();
}
叫
public interface QuackBehavior {public void quack();
}
那么在我举例中 我们有两种鸭子一种是绿头鸭子,可以飞,也可以叫,一种普通的模型鸭子不会飞,但是可以叫。
绿头鸭子
public class MallardDuck extends Duck{@Overridepublic void display(){System.out.println("I'm a real Mallard duck");}
}
模型鸭子
public class ModelDuck extends Duck{@Overridepublic void display() {System.out.println(" i'm a model duck ");}
}
那么我们的绿头鸭子又有那些行为呢?我们距离了两种行为,1,可以叫,2可以飞,那么我们就要有2个实现
可以飞
public class FlyWithWings implements FlyBehavior{@Overridepublic void fly() {System.out.println("I'm flying!!");}
}
可以叫
@Overridepublic void quack() {System.out.println("Quack");}
同理我们的模型鸭子不会飞但是可以叫
吱吱叫
public class Squeak implements QuackBehavior{@Overridepublic void quack() {System.out.println(" Squeak ");}
}
不会飞
public class FlyNoWay implements FlyBehavior{@Overridepublic void fly() {System.out.println("I'm can't fly !!");}
}
现在我们的准备工作准备完成了。那么设计模式的第三个原则,组合我们又要怎么使用呢?这里就要接种我们的 多态 来操作了。
我们先来改造一下我们的鸭子类,让我们的鸭子类具有飞,和叫的基础。
public abstract class Duck {public FlyBehavior flyBehavior;public QuackBehavior quackBehavior;public abstract void display();public void performFly() {flyBehavior.fly();}public void performQuack() {quackBehavior.quack();}public void swim() {System.out.println(" All ducks float, even decoys!");}public void setFlyBehavior(FlyBehavior flyBehavior) {this.flyBehavior = flyBehavior;}public void setQuackBehavior(QuackBehavior quackBehavior) {this.quackBehavior = quackBehavior;}
}
这样我们的绿头鸭子和模型鸭子已经具有了飞和叫的行为,那么行为方式又该是什么样呢?多态 就体现在这里了
绿头鸭子
package one;public class MallardDuck extends Duck{public MallardDuck() {quackBehavior = new Quack();flyBehavior = new FlyWithWings();}@Overridepublic void display(){System.out.println("I'm a real Mallard duck");}}
模型鸭子
package one;public class ModelDuck extends Duck{public ModelDuck(){flyBehavior = new FlyNoWay();quackBehavior = new Squeak();}@Overridepublic void display() {System.out.println(" i'm a model duck ");}
}
编写测试类
public class MiniDuckSimulator {public static void main(String[] args) {Duck mallard = new MallardDuck();mallard.performFly();mallard.performQuack();Duck modelDuck = new ModelDuck();modelDuck.performFly();modelDuck.performQuack();}
}
这样的组合,我们的鸭子就实现了不同的行为方式。我们把鸭子一系列行为定义成算法族,分别封装,这样就符合了策略模式。
扩展 我们改装了模型鸭子之后,增加了一个飞行器,他会飞了,我们想让他在运行的时候动态改变飞的方式又要怎么做呢?
ps: 上边类中有提示的!!!想要源码的可以私聊我,或者自己复制上面的内容。
设计模式1(策略模式)相关推荐
- Java设计模式之策略模式与状态模式
一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...
- 换个姿势学设计模式:策略模式
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...
- 研磨设计模式之 策略模式--转
http://www.uml.org.cn/sjms/201009092.asp 研磨设计模式之 策略模式 2010-09-09 作者:云飞龙行 来源:云飞龙行的blog 先感谢众多朋友的支持 ...
- 设计模式:策略模式(Strategy)
定 义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...
- C++设计模式之策略模式(Strategy)
Strategy策略模式 作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: 代码实现 #include <iostream& ...
- python策略模式包含角色_详解Python设计模式之策略模式
虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...
- 一篇博客读懂设计模式之-----策略模式
设计模式之策略模式 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的对象 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情况下 ...
- 面向对象设计模式之策略模式
面向对象设计模式之策略模式 1.策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 2.抽象鸭子类,鸭子飞行行为在此处类似于算法族 1 package ...
- java策略模式详解_Java经典设计模式之策略模式原理与用法详解
本文实例讲述了Java经典设计模式之策略模式.分享给大家供大家参考,具体如下: 策略模式指:策略模式指将程序中可变部分抽象分离成一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式 ...
- 策略设计模式_设计模式之策略模式总结
再上一篇文章<设计模式之策略模式>中,我们通过模拟鸭子项目,了解了什么是策略模式,怎么使用策略模式.本文将通过鸭子项目的学习,对策略模式进行总结. 策略模式: 分别封装行为接口,实现算法族 ...
最新文章
- 知识图谱升温之势已现,不要错失下一个AI风口
- 配置ssh_config
- pytorch处理多维输入的问题
- python docx 设置字体_python docx 中文字体设置的操作方法
- NetCat Tutorials
- activiti idea 请假流程_IDEA开发流程Activiti需要注意的一些坑
- LoadRunner
- 学python需要记笔记吗_开始学python,一些笔记
- erlang---启动参数学习/研究
- php mysql web应用,PHP+MySQL Web应用开发
- 有一个计算机在桌子上用英语怎么写,什么在桌子上的英文怎么写
- byte[] 数组和字符串的转换,与byte[] 数组和int类型的之间的转化
- python编程快速上手
- L1-019 谁先倒 (15 分) — 团体程序设计天梯赛
- UltraEdit 与 正则表达式 [转]
- win7虚拟机_UTM 虚拟机不越狱运行 win7,百分百可以
- arcgis怎么压缩tif文件_PDF文件怎么压缩?两招帮你解决PDF压缩难题!
- celery异步发送邮箱
- 不那么完美的 RSS 订阅方案 — feedly + RSSHub Radar
- arm嵌入式web服务器 性能,arm嵌入式web服务器