java输出不同颜色_Java设计模式-策略模式、状态模式
推荐阅读:
一只Tom猫:都是“Redis惹的祸”,害我差点挂在美团三面,真是“虚惊一场”!
java喵:6大面试技能树:JAVA基础+JVM+算法+数据库+计算机网络+操作系统
前言
当代码中出现多重if-else语句或者switch语句时,
弊端有二:弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else或者switch代码进行更改,要是遗漏了某一处,那么程序就会出错。弊端之二:代码逻辑难以理解。
卫语句
卫语句的使用,并不能改变前言说的弊端:一旦需求更改,需要修改所有使用更改需求的if-else代码块。不过使用卫语句可以让自己或者代码维护人员很容易的了解代码的含义。
代替异常分支
所谓的异常分支就是普通情况之外的分支,这种情况的下的if-else可以用以下代替。
if (condition) return obj;
代替多重if-else分支
这个情况的代替方式是可以为
if (isSunshine()) { // 晴天时处理逻辑}if (isRain()) { // 下雨时处理逻辑}if (isOvercast()) { // 阴天时处理逻辑}...
策略模式
使用策略模式可以代替多重if-else和switch语句,让代码维护变得更加简单。 策略模式UML:
- 环境(Context)角色:持有一个Strategy的引用
- 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现
- 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为
策略模式代码模板:
/** * @description 环境角色 */public class Context { /** * 策略对象 */ private Strategy strategy; /** * @param strategy 具体策略对象 */ public Context(Strategy strategy) { this.strategy = strategy; } /** * @description 执行策略方法 */ public void contextInterface() { strategy.strategyInterface(); }}
/** * @description 具体策略类A */public class ConcreteStrategyA implements Strategy { @Override public void strategyInterface() { // TODO Auto-generated method stub }
/** * @description 具体策略类B */public class ConcreteStrategyB implements Strategy { @Override public void strategyInterface() { // TODO Auto-generated method stub }
/** * @description 具体策略类C */public class ConcreteStrategyC implements Strategy { @Override public void strategyInterface() { // TODO Auto-generated method stub }
实例应用:水果有不同种类,每种水果对应不同价格,用策略模式实现。
/** * @description 抽象策略,水果接口 */public interface Fruit { /** * @description 输出对应价格 */ void price();
/** * @description 具体策略,苹果类 */public class Apple implements Fruit { @Override public void price() { System.out.println("苹果的价格!"); }
/** * @description 具体策略,香蕉 */public class Banana implements Fruit { @Override public void price() { System.out.println("香蕉的价格!"); }
** * @description 具体策略,梨 */public class Pear implements Fruit { @Override public void price() { System.out.println("梨的价格!"); }
/** * @description 策略环境,输出水果价格 */public class FruitPrice { /** * 策略对象 */ private Fruit fruit; /** * @param fruit 策略对象 */ public FruitPrice(Fruit fruit) { this.fruit = fruit; } /** * @description 输出水果价格 */ public void printFruitPrice() { fruit.price(); }
客户端
/** * @description 使用策略模式:针对一组算法,将每一个算法封装到具有共同接口的独立的类 */ public static void useStrategy() { // 具体使用策略 Fruit apple = new Apple(); // 将策略放入环境中并执行策略 new FruitPrice(apple).printFruitPrice();
状态模式
状态模式类图:
说明:
环境(Context)角色,也成上下文:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态
抽象状态(State)角色:定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为
具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为
策略模式代码模板:
/** * @description 抽象状态角色 */public interface State { /** * @description 处理方法 */ void handle()
** * @description 具体状态类B */public class ConcreteStateB implements State { @Override public void handle() { // TODO Auto-generated method stub }
/** * @description 具体状态类C */public class ConcreteStateC implements State { @Override public void handle() { // TODO Auto-generated method stub }
/** * @description 状态模式,环境角色类 */public class Context { /** * 状态对象 */ private State state; /** * @description 设置状态 * @param state 具体状态 */ public void setState(State state) { this.state = state; } /** * @description 执行策略方法 */ public void request() { state.handle(); }
实例应用:橘子有不同颜色,状态不同的橘子颜色不同,用状态模式实现。
/** * @description 状态模式,状态接口 */public interface Orange { /** * @description 输出橘子的颜色 */ void printColor();}
** * @description 状态2:青色的橘子 */public class CyanOrange implements Orange { @Override public void printColor() { System.out.println("My color is cyan!"); }
** * @description 橘子状态管理器 */public class OrangeStateManage { /** * 橘子的状态 */ private Orange state; /** * @description 设置橘子的状态 * @param state */ public void setState(Orange state) { this.state = state; } /** * @description 输出当前状态的橘子颜色 */ public void print() { state.printColor(); }
/** * @description 状态1:红色外观的橘子 */public class RedOrange implements Orange { @Override public void printColor() { System.out.println("My color is red!"); }}
/** * @description 状态3:黄色的橘子 */public class YellowOrange implements Orange { @Override public void printColor() { System.out.println("My color is yellow!"); }
客户端
/** * @description 使用状态模式:状态模式,又称状态对象模式(Pattern of Objects for * States),状态模式是对象的行为模式。状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样 */ public static void useState() { // 具体使用状态 Orange cyanOrange = new CyanOrange(); // 创建环境 OrangeStateManage orangeStateManage = new OrangeStateManage(); // 设置状态并执行 orangeStateManage.setState(cyanOrange); orangeStateManage.print();
策略模式和状态模式的比较
讲真,我觉得它们都差不多啊,好难区别啊!!!
不过,虽然讲不出来它们的区别是什么,但是有个例子可以很好的描述它们的区别
状态模式:这个模式就好比员工申请离职单的流程,离职单到直接上级,这个状态就是直接上级批示,等直接上级审阅之后,通过了就到下一个状态。这一个个状态对应不同的处理,这是有顺序要求的。
策略模式:这个模式好比于你假期要出国游玩,有日本、美国、新加坡等国家,你每到一个国家就执行不同的游玩策略,可以先去日本,也可以先去美国,没有顺序要求。
版权声明:本文为CSDN博主「秦岭熊猫」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tianshan2010/article/details/103681617
java输出不同颜色_Java设计模式-策略模式、状态模式相关推荐
- java策略设计模式输出字母_Java 设计模式-策略模式(Strategy Pattern)
策略模式(Strategy Pattern)属于对象行为模式.其作用是针对一组算法,将每个算法封装到具有共同接口的独立类中,从而使它们可以相互替换. 策略模式的意图是将可以互换的方法封装在各自的对立类 ...
- java工厂方法_Java设计模式之工厂方法模式
2.工厂方法模式 <设计模式之禅>中用神话故事女娲造人来比概述工厂方法模式. 女娲采集黄土捏成人的形状,然后放到八卦炉中烧制,最后放置到大地上生长,工艺过程是没有错的,但是意外随时都会发生 ...
- 《设计模式详解》行为型模式 - 状态模式
状态模式 6.5 状态模式 6.5.1 反例 6.5.2 结构 6.5.3 案例实现 6.5.4 优缺点 6.5.5 使用场景 完整的笔记目录:<设计模式详解>笔记目录,欢迎指点! 行为型 ...
- 从王者荣耀看设计模式(六.状态模式)
从王者荣耀看设计模式(状态模式) 一.简介 英雄项羽在敌方英雄的攻击下存在3种不同的状态. 1.在健康生命值下--普通状态,在每次被攻击时,当前生命值=剩余生命值-敌方英雄伤害值 2.在生命值低于某一 ...
- 【游戏设计模式】之三 状态模式、有限状态机
转载自:https://blog.csdn.net/poem_qianmo/article/details/52824776 游戏开发过程中,各种游戏状态的切换无处不在.但很多时候,简单粗暴的if e ...
- 【游戏设计模式】之三 状态模式、有限状态机 Unity版本实现
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/52824776 作者:毛星云(浅 ...
- 【游戏设计模式】之三 状态模式 有限状态机 Unity版本实现
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/52824776 作者:毛星 ...
- 设计模式之略见一斑(状态模式State)
设计模式中的状态模式相对比较简单,简单的说就是对某个对象的状态进行管理.对象的状态如果的多的话,假如没有对其进行管理,极易造成管理混乱.从而使系统难以维护,所以State模式的意图就是将与状态有关的处 ...
- 设计模式 — 行为型模式 — 状态模式
目录 文章目录 目录 状态模式 应用场景 代码示例 状态模式 状态模式,当对象的内部状态发生了改变的时候,允许对象执行不同的流程. 优点: 封装了状态转换规则. 枚举了可能的状态,在枚举状态之前需要确 ...
最新文章
- 生命的真谛不在于你呼吸的次数,而在于那些令你无法呼吸的时刻
- LNMP - Warning: require(): open_basedir restriction in effect错误解决方法
- h264 流、帧结构
- Ubuntu安装搜狗输入法
- keepalived 构建主备mysql
- caffe学习:通过研读classification.cpp了解如何使用caffe模型
- 红象云腾发布新一代PB级高速大数据平台产品
- 更改Sharepoint管理中心端口号
- 信息安全工程师笔记-大数据安全威胁与需求分析
- FlashBuilder 4.5 安装图解
- win10企业版下载,最新windows10企业版iso镜像官方下载
- php+tcpdf+表格,PHP使用tcpdf类生成PDF文件
- 使用百度网盘自动同步Zotero的文献
- picpick尺子像素大小精度不够准确_谈谈“精度”与“分辨率”,很多人容易混淆的问题。...
- Flask入门教程—超详细
- imx6 android4.4 Recovery添加从U盘升级功能
- Java中继承和实现的区别【单继承,多实现】
- Python 中的取余与取整操作
- 电子计算机的四个名称,文件夹,文件夹名称唯美四个
- 世界上各种壮观震撼奇景。也许你这辈子都看不到了!
热门文章
- curl php 百度,php curl 模拟登录百度主页
- mysql 查询表的key_mysql查询表和字段的注释
- archlinux详细安装步骤_最新Centos的liunx安装宝塔的详细步骤
- go语言 doc转换html,go语言使用wkhtmltopdf工具将html转成pdf
- python大数据零基础_零基础学习大数据人工智能,学习路线篇!
- android 实例源码解释,Android Handler 原理分析及实例代码
- python3.0下载用什么浏览器_无法让Python下载网页源代码:“不支持浏览器版本”...
- 语句拼接_Linux 进阶语句
- 开发简化版NgFor
- 苹果可弯曲屏幕新专利获准,折叠iPhone最快2020年现身?