面向对象设计模式之策略模式
1.策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
2.抽象鸭子类,鸭子飞行行为在此处类似于算法族
1 package com.pattern.strategy; 2 /** 3 * 抽象鸭子 4 * @author Administrator 5 * 6 */ 7 public abstract class Duck { 8 9 FlyBehavior fb;//行为接口声明两个引用变量,所有鸭子子类都继承他 10 Quack q; //鸭子鸣叫行为接口 11 12 13 //加入两个set方法,用来改变鸭子的行为 14 public void setFb(FlyBehavior fb) { 15 this.fb = fb; 16 } 17 18 public void setQ(Quack q) { 19 this.q = q; 20 } 21 22 public Duck() { 23 // TODO Auto-generated constructor stub 24 } 25 26 public abstract void display();//展示鸭子的样子,不同的鸭子样子不一样 27 28 //鸭子的飞行委托给行为类 29 public void performFly(){ 30 fb.fly(); 31 } 32 33 public void performQuack(){ 34 q.quack(); 35 } 36 //所有的鸭子都会游泳 37 public void swim(){ 38 System.out.println("all ducks float,even decoys!"); 39 } 40 41 }
3.鸭子飞行行为接口
1 package com.pattern.strategy; 2 /** 3 * 所有飞行行为类必须实现此接口 4 * @author Administrator 5 * 6 */ 7 public interface FlyBehavior { 8 9 public void fly(); 10 11 12 13 } 14 /** 15 * 飞行行为的实现者,给真会飞的鸭子用 16 * @author Administrator 17 * 18 */ 19 class FlyWithWings implements FlyBehavior{ 20 21 @Override 22 public void fly() { 23 System.out.println("I AM FLYING!"); 24 25 } 26 27 } 28 /** 29 * 飞行行为的实现者,给不会飞的鸭子用 30 * @author Administrator 31 * 32 */ 33 class FlyNoWay implements FlyBehavior{ 34 35 @Override 36 public void fly() { 37 System.out.println("I CANT'T FLY!"); 38 39 } 40 41 } 42 /** 43 * 增加一个火箭动力飞行行为 44 * @author Administrator 45 * 46 */ 47 class RocketFly implements FlyBehavior{ 48 49 @Override 50 public void fly() { 51 System.out.println("一飞冲天"); 52 53 } 54 55 }
4.鸭子鸣叫行为接口
package com.pattern.strategy; /*** 所有鸣叫行为类必须实现此接口* @author Administrator**/ public interface Quack {public void quack();} //呱呱叫的行为实现 class QQuack implements Quack{@Overridepublic void quack() {System.out.println("quack quack!");}} //吱吱叫的行为实现 class Squack implements Quack{@Overridepublic void quack() {System.out.println("ZHI ZHI");}} /*** 不会叫的行为实现* @author Administrator**/ class Silence implements Quack{@Overridepublic void quack() {System.out.println("silence");}}
5.鸭子的实现类绿头鸭,会飞也会叫
package com.pattern.strategy; /*** 鸭子的实现类,绿头鸭* @author Administrator**/ public class MallDuck extends Duck {public MallDuck() {super();fb = new FlyWithWings();//绿头鸭带翅膀会飞q = new QQuack();//绿头鸭是呱呱叫// TODO Auto-generated constructor stub }@Overridepublic void display() {System.out.println("i am a MallDuck");}}
6.鸭子实现类模型鸭子,不会飞,也不会叫
package com.pattern.strategy; /*** 模型鸭子* @author Administrator**/ public class ModelDuck extends Duck {public ModelDuck() {super();fb = new FlyNoWay();q = new Silence();// TODO Auto-generated constructor stub }@Overridepublic void display() {System.out.println("我 是 模型 鸭子");}}
7.客户端测试代码
package com.pattern.strategy; /*** 测试类,把行为看做一个算法族,算法代表鸭子能做的事,客户使用封装好的飞行和呱呱叫算法族* 这种做法就是组合,鸭子的行为不是继承来的,而是适当的行为对象组合来的,如FlyBehavior和Quack* 使用组合将算法组封装成类,可以运行时动态的改变行为* @author Administrator**/ public class Simulator {public static void main(String[] args) {Duck d = new MallDuck();d.performFly();d.performQuack();Duck model = new ModelDuck();model.performFly();//模型鸭子不会飞//我突然想让他飞model.setFb(new RocketFly());//运行时改变鸭子的行为,只需要调用set方法即可 model.performFly();}}
8.测试结果
9.
常见开发中场景:
---JAVASE中GUI编程,布局管理
---Spring框架中,Resource接口,资源访问策略
---javax.servlet.http.HttpServlet#service();
转载于:https://www.cnblogs.com/huipengbo/p/6876377.html
面向对象设计模式之策略模式相关推荐
- 换个姿势学设计模式:策略模式
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...
- python策略模式包含角色_详解Python设计模式之策略模式
虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...
- 橘子学设计模式之策略模式
策略模式 1.简介 俗话说:条条大路通罗马.在很多情况下,实现某个目标的途径不止一条,例如我们在外出 旅游时可以选择多种不同的出行方式,如骑自行车.坐汽车.坐火车或者坐飞机,可根据实 际情况(目的地. ...
- 锈才学设计模式之 —— 策略模式(Strategy Pattern)
锈才学设计模式之 -- 策略模式 策略模式:把功能提供者单独封装成类,使它们可以互相替换使用,让功能提供者独立于使用者(调用者). 说明: 在面向对象编程中,我们尽量将功能(类)设计成复用,以符合O ...
- 设计模式之策略模式详解
设计模式之策略模式详解 概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车.可以坐汽车.可以坐火车.可以坐飞机. 作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有 ...
- Java设计模式之策略模式与状态模式
一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...
- 研磨设计模式之 策略模式--转
http://www.uml.org.cn/sjms/201009092.asp 研磨设计模式之 策略模式 2010-09-09 作者:云飞龙行 来源:云飞龙行的blog 先感谢众多朋友的支持 ...
- 设计模式:策略模式(Strategy)
定 义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...
- C++设计模式之策略模式(Strategy)
Strategy策略模式 作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: 代码实现 #include <iostream& ...
最新文章
- GridView控件修改、删除示例(修改含有DropDownList控件)
- 通用工具之Pair和Tuple-《C++标准库(第二版)》读书笔记
- Semaphore 类
- NSIS设置桌面快捷方式的图标
- 重拾python Day 1
- iOS 采集音视频及写入文件
- tcp 组播_华为组播理论知识详解(二)
- 前端学习(2529):搭建中央管理
- linux x86 关机 过程,linux在x86上的中断处理过程(详细)
- java gc回收堆还是栈_浅析JAVA的垃圾回收机制(GC)
- Python爬虫_乱码、转码
- selenium 定位方式3-css_selector
- mysql一样的查询在我本地很快但是线上很慢_Mysql读写分离原理及主众同步延时如何解决...
- 关于局部变量的几个难点
- java xssf 字体样式_Apache POI字体/Fonts
- 操作系统课设实验五---Nachos文件系统扩展
- FireFox如何使用扩展
- rslogix5000pide实例_用RSLogix5000梯形图实现一种高级PID运算
- 无源贴片晶振四角引脚_四脚贴片晶振有方向之分吗
- python乒乓球比赛规则介绍_乒乓球比赛的简要规则
热门文章
- ./configure make make install详解
- java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListene解决办法
- Anroid View事件响应机制和ViewGroup的事件响应分发机制
- android 中文语音
- 使用Sonatype Nexus搭建Maven镜像的几点注意事项
- redmine-project.net vs redmine vs trac vs apis项目管理软件选型比较
- 使用 varchar(max)、nvarchar(max) 和 varbinary(max) 数据类型代替text、ntext 和 image 数据类型...
- python里面的工厂模式
- 打印杨辉三角(数组练习)
- ansible web_最小的Web浏览器,Microsoft Access替代品,Ansible,Kubernetes,JavaScript,piwheel等