Java 设计模式之策略模式(Strategy Pattern)
策略模式将程序的不变部分保留,可变部分单独拿出,然后封装起来,让今后此功能的扩展和修改更加方便。
此策略强调使用组合而非继承。
案例:
我们想模拟两种鸭子: 普通鸭, 橡胶鸭
我们知道这三种鸭子不可变的是都会游泳(swim),可变的是:能否飞(fly) 和 能否叫(quack)
第一步:我们将可变部分拿出,分别封装为两个接口:flyBehavior 和 quackBehavior
public interface FlyBehavior {public void fly();
}----------------------------------分割线----------------------------------------------
public interface QuackBehavior {public void quack();
}
----------------------------------分割线----------------------------------------------
第二步:
飞行行为(flyBehavior)分为会飞(FlyWithWings)与不会飞(FlyNoWay)
所以我们应该新创建两个新class继承接口flyBehavior:
public class FlyWithWings implements FlyBehavior {public void fly(){System.out.println("我会飞");}
}
----------------------------------分割线----------------------------------------------
public class FlyNoWay implements FlyBehavior {public void fly(){System.out.println("我不会飞");}
}
第三步:
同理鸣叫行为(QuackBehavior)分为会叫(Quack)与不会叫(MuteQuack):
public class Quack implements QuackBehavior{@Overridepublic void quack() {System.out.println("我会叫");}
}
----------------------------------分割线----------------------------------------------
public class MuteQuack implements QuackBehavior{@Overridepublic void quack() {System.out.println("我不会叫");}
}
第四步:
建立鸭子父类Duck, 加入两个实例变量 flyBehavior 和 quackBehavior(也就是第一步创建的两个接口)以及两个实例变量的配套方法performFly(), performQuack(),setFlyBehavior,setQuackBehavior。
还有两个不变方法 display() 和 swim()
public abstract class Duck {FlyBehavior flyBehavior;QuackBehavior quackBehavior;public Duck(){}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 fb){flyBehavior = fb;}public void setQuackBehavior(QuackBehavior qb){quackBehavior = qb;}}
第五步:
创建两个class 橡胶鸭(RubberDuck) 和 普通鸭(ModelDuck), 分别继承第四步创建的Duck
public class RubberDuck extends Duck {public RubberDuck(){//橡胶鸭不会飞flyBehavior = new FlyNoWay();//橡胶鸭会叫quackBehavior = new Quack();}@Overridepublic void display() {System.out.println("我是橡胶鸭");}
}
----------------------------------分割线----------------------------------------------
public class ModelDuck extends Duck{public ModelDuck(){//普通鸭会飞flyBehavior = new FlyWithWings();//普通鸭会叫quackBehavior = new Quack();}@Overridepublic void display() {System.out.println("我是普通鸭");}
}
第六步:
大功告成!喝口水庆祝一下
第七步 :测试
创建一个class 用于测试
public class MiniDuckSimulator {public static void main(String[] args) {Duck rubber = new RubberDuck();rubber.display();rubber.performFly();rubber.performQuack();System.out.println("-------------------------------------------");Duck model = new ModelDuck();model.display();model.performFly();//飞行状态改为不会飞model.setFlyBehavior(new FlyNoWay());model.performFly();}
结果:
我是橡胶鸭
我不会飞
我会叫
-------------------------------------------
我是普通鸭
我会飞
我不会飞
第八步:
加入新功能火箭飞行(RocketPoweredFly)
创建新类RocketPoweredFly, 继承接口 FlyBehavior
public class RocketPoweredFly implements FlyBehavior{@Overridepublic void fly() {System.out.println("我可以火箭推动");}
}
测试:
public class MiniDuckSimulator {public static void main(String[] args) {Duck model = new ModelDuck();model.display();model.performFly();//飞行状态改为火箭飞行model.setFlyBehavior(new RocketPoweredFly());model.performFly();}
}
结果:
我是普通鸭
我会飞
我可以火箭推动
Java 设计模式之策略模式(Strategy Pattern)相关推荐
- 8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式- Strategy Pattern 在POS系统中,有时需要实行价格优惠, 该如何处理? 对普通客户或新客户报全价 对老客户统一折扣5% 对大客户统一折扣10% 注:课件 ...
- 二十四种设计模式:策略模式(Strategy Pattern)
策略模式(Strategy Pattern) 介绍 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例 有一个Message实体类,对它的操 ...
- 锈才学设计模式之 —— 策略模式(Strategy Pattern)
锈才学设计模式之 -- 策略模式 策略模式:把功能提供者单独封装成类,使它们可以互相替换使用,让功能提供者独立于使用者(调用者). 说明: 在面向对象编程中,我们尽量将功能(类)设计成复用,以符合O ...
- 设计模式实战-策略模式(Strategy Pattern)
0 联系我 图片标题 1.Q群[Java开发技术交流]:jq.qq.com/?_wv=1027&a- 2.完整博客链接:www.shishusheng.com 3.知乎:www.zhihu.c ...
- Java设计模式之——策略模式(Strategy)
一.例子 令狐冲被岳不群罚在思过崖上面壁思过.偶然的机会发现崖内有一个后洞,石壁上刻有魔教十长老尽破五岳剑派的图形招式.所有五岳剑派引以为豪的精微奥妙招式尽数被破得干干净净,包括一些已经失传的招式. ...
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了"工厂模式"."策略模式" ...
- 解读设计模式----策略模式(Strategy Pattern)
一.模式概述 策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法. 在我应 ...
- Java 设计模式之策略模式
一.了解策略模式 1.1 什么是策略模式 策略模式 (Strategy Pattern) 是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换.此模式让算法的变化独立于使用算法的客 ...
- java解决策略膨胀_折腾Java设计模式之策略模式
简介 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式.简单理解就是一组算法,可以互换,再简单点策略就是封装算法. 意图 定义一 ...
- Java设计模式之策略模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
最新文章
- 【转】Itween 贝塞尔曲线(一)
- python中使用格式化字符串
- android bool定义,android-R.bool
- 专题导读:新基建环境下的数据资产价值评估与定价
- html新增伪类,css3新增伪类有哪些
- 【英语学习】【Level 08】U05 Better option L4 Being social
- [河南省ACM省赛-第四届] 表达式求值(nyoj 305)
- [译]深入 NGINX: 为性能和扩展所做之设计
- java中关于x轴翻转和y轴翻转如何计算_如何用加速度计提高倾角测量精度?
- django+xadmin在线教育平台(四)
- html 恶作剧无限弹窗
- 车型车系品牌api离线版 CarApi
- UNIX网络编程卷1:套接字联网API(第3版).pdf
- android9应用icon尺寸,APP-icon尺寸
- 【Linux】之 从源代码安装软件(HelloWorld)
- Hello MySQL(八)——自定义函数
- es6 三点运算符_ES6/ES7 三点式 —— 扩展运算符与剩余操作符
- VMWare下载安装以及创建虚拟机教程
- 缓解迷茫焦虑的最好方法:用自己的方式好好生活
- 「助记词密盒」用户协议与隐私政策
热门文章
- 通过阿里云api获取ecs主机信息
- ivor horton《c语言入门经典》,《C语言入门经典》Ivor Horton第九章练习题
- 紫装の槍使い(トゥーヴァ) / 紫枪(异时层土法)
- Python的一个小程序题
- Miniconda3环境搭建详细流程
- [译] 改善 DaVinci Resolve 性能的 5 个秘诀
- Windows/Ubuntu双系统磁盘管理中删除Ubuntu分区后Ubuntu EFI分区无法删除卷解决办法
- STM32-USB学习系列(一) :USB与USB库的介绍
- 二维码怎么知道自己被扫描 ()==> java 篇 带一点点(Android)
- jQuery UI 拖拽功能