java输出不同颜色_Java设计模式-策略模式、状态模式

815756052c3a42c9938c5688880aea1c.png

推荐阅读:

一只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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/541216.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++stl和std_std :: rotate()函数以及C ++ STL中的示例

cstl和stdC STL std :: rotate()函数 (C STL std::rotate() function) rotate() function is a library function of algorithm header, it is used to rotate left the elements of a sequence within a given range, it accepts the range (start, end) and a middle point,…

计算机硬盘正在工作应特别注意避免,初级计算机考试题库

计算机的初级基本*作包括基本信息栏、计算机的基础知识、五笔字型基础、*互联网的*作、常用办公外设的使用、计算机硬件的日常维护与保养和office办公工具的应用。下面是初级计算机考试题库,请参考!1.以下与信息有关的设备计算中,用于存储信息…

abap 添加alv上的工具栏的按钮_神器必会!“世界上最好的编辑器Source Insight”...

前言“Source Insight(以下简称SI)是世界上最好的编辑器”,说这句话不知道会不会出门被打呢?-_- 中国古话说得好,“文无第一,武无第二”,所以不敢说SI是最好的,但是说是“最好的之一”绝对是妥妥的。它以丰…

SLF4J with Logback in a Maven Project | Mograblog

SLF4J with Logback in a Maven Project | Mograblog

Ruby中带有示例的Hash.key?(value)方法

Hash.key?(value)方法 (Hash.key?(value) Method) In this article, we will study about Hash.key?(value) Method. The working of the method cant be assumed because its quite a different name. Let us read its definition and understand its implementa…

计算机课伤害事故的防范,体育课安全伤害事故的防范与处理

摘 要:近年来,在教育改革的背景下,学校方面特别重视体育教学这一环节。做好体育教学工作,一方面能够使学生达到强身健体的目的,另一方面能够使学生的综合素质水平得到有效提升。然而,在体育课中还会发生一些…

同一个容器实例可以同时运行在多个宿主机_从零开始学K8s: 3.什么是容器

Kubernetes使用Linux容器技术来实现应用的隔离。因此在深入学习k8s之前,我们需要先学习容器的基础知识以便更好地去理解k8s的原理机制。揭开容器的神秘面纱当一个应用只由较少数量的大组件构成时,完全可以给每个组件分配一个专用的虚拟机,以及…

__str__是什么函数_PHP str_shuffle()函数与示例

__str__是什么函数PHP str_shuffle()函数 (PHP str_shuffle() Function) str_shuffle() function is a string function and it is used to shuffle all characters randomly in the string. str_shuffle()函数是一个字符串函数,用于随机地随机排列字符串中的所有字…

SpringBoot集成RabbitMq消息队列【附源码】

1. 项目背景 要啥项目背景,就是干!!! SpringBoot版本:2.7.12 2. Rabbit MQ安装 这里讲解使用docker安装RabbitMQ,如果在windows下面安装RabbitMQ,参考下文 【笑小枫的按步照搬系列】Window…

【云栖直播】精彩推荐第3期:个性化推荐系统搭建实践

热门推荐 (1)即将直播持续集成与交付:分层自动化之UI自动化体系建设直播简介:本系列直播由阿里旗下一站式研发提效平台云效策划推出,主要为大家详细介绍阿里巴巴在持续集成和持续交付的最佳实践。 直播讲师&#xff1a…

全国计算机等级考试和cct区别,全国计算机等级考试(NCRE)和CCT的区别你了解多少?...

在大学,很多学生都在纠结,到底学什么技能在以后的就业中能够提升自己的核心竞争力。在众多等级考试中,全国计算机等级考试可以说是相对热门的考试。关于计算机等级考试,一共有两种,一类是全国高等学校计算机水平考试(C…

ensp路由器无法启动_品胜云路由器Breed刷入详细教程,技巧和注意事项,功能大增...

前面发文,介绍过品胜净音云路由器WFR101N功能,硬件配置参数,高清拆解图。主要硬件参数:闪存型号是W25Q128FVSG,容量大小是16M;内存是华邦的W9751G6KB-25,DDR2 SDRAM内存,大小64M&…

第二个冲刺期的第六天

昨天写好了购物车的功能; 今天决定开始写下订单的功能; 明天的话继续写下订单的功能; 遇到的问题:由于购物车是用session实现的,所以生成订单的话会遇到一些问题,比如说订单条目往数据库的写入。 &#xff…

chunk_split_PHP chunk_split()函数与示例

chunk_splitPHP chunk_split()函数 (PHP chunk_split() function) chunk_split() function is used to split the given string into chunks of small parts, it accepts the string returns the parts of the strings specified by the other parameters. chunk_split()函数用…

对计算机视觉研究的认识,计算机视觉(作业)

视觉是各个应用领域,如制造业、检验、文档分析、医疗诊断,和军事等领域中各种智能/自主系统中不可分割的一部分。由于它的重要性,一些先进国家,例如美国把对计算机视觉的研究列为对经济和科学有广泛影响的科学和工程中…

map函数python求数的每位的值_map函数_实现批量计算

作者Toby,持牌照消费金融模型经理,发明国家算法专利,国内最大医药数据中心数据挖掘部门负责人!和重庆儿科医院,中科院教授,赛柏蓝保持慢病数据挖掘项目合作!清华大学,百度,腾讯&…

Flask 视图

写个验证用户登录的装饰器:在调用函数前,先检查session里有没有用户 from functools import wraps from flask import session, abortdef login_required(func):wraps(func)def decorated_function(*args, **kwargs):if not user in session:abort(401)r…

wps计算机打印双面输出,在wps中双面打印的方法步骤详解

我们在打印word文档的时候往往都会使用到双面打印,那么今天小编教你怎么在wps中双面打印。希望对你有帮助!WPS双面打印的步骤首先点击wps上的文字选项。找到打印按钮。点击打开之后,会跳出这样一个页面。PS双面打印的步骤图1页面内&#xff0…

PHP array_merge()函数与示例

PHP array_merge()函数 (PHP array_merge() function) array_merge() function is used to merge two or more arrays, it returns a new array with merged elements. array_merge()函数用于合并两个或多个数组,它返回一个具有合并元素的新数组。 Syntax: 句法&am…

linux pwm 调屏_Linux驱动学习之:PWM驱动

PWM(Pulse Width Modulation)——脉宽调制,它是利用微控制器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用于测量、通信、功率控制与变换等许多领域。s3c2440芯片中一共有5个16位的定时器,其中有4个定时器(定时器0~定时器3)具…