关于设计模式:浅谈设计模式-状态模式十三
浅谈设计模式 - 状态模式(十三)前言 状态模式其实也是一个非常常见的模式,最常见的利用场景是线程的状态切换,最常应用的形式就是对于If/else进行解耦,另外这个模式能够配合 责任链模式组合搭配出各种不同的状态切换成果,能够用设计模式模仿一个简略的“工作流”。 优缺点: 状态模式非常明显的是用于解耦大量If/else的模式,所以他的长处非常突出,就是能够简化大量的if/else判断,然而毛病页非常显著,那就是程序的执行受限于状态,如果状态的常量十分多的状况下,仍然会呈现大量的if/else的景象,状态模式和策略模式一样一旦状况十分复杂的时候很容易造成类的收缩,当然少数状况下这种毛病简直能够疏忽,总比太多。 对于状态模式在jdk1.8之后的lambada表达式中能够有体现,lambada实现了java的参数“办法化”,这样极大地简化了类的收缩,然而可能比拟难以了解,并且一旦简单仍然倡议应用状态来实现切换,这样更不便保护。 状态模式的结构图: 上面是状态模式的结构图,自身比较简单,仿佛并没有什么特地的中央,然而当咱们和“策略模式”比照之后,仿佛很容易混同,上面咱们来看下这两个结构图的比照: 状态模式结构图: 策略模式结构图: 通过比照能够看到,状态和策略这两个模式是十分相似的,那么咱们应该如何辨别这两个模式呢?在平时的开发工作中,如果一个对象有很多种状态,并且这个对象在不同状态下的行为也不一样,那么咱们就能够应用状态模式来解决这个问题,然而如果你让同一事物在不同的时刻有不同的行为,能够应用策略模式触发不同的行为。打个比方,如果你想让开关呈现不同的行为,你须要设计两个状态开关,而后在事件处理的时候将逻辑散发到不同的状态实现触发,而如果你想要实现相似商品的折扣或者优惠促销,满减等等“模式”的时候更加适宜应用策略,当然如果无奈辨别也没有关系,哪个应用更为纯熟即可。 案例:糖果机 这是《head first设计模式》中对于状态模式案例当中的糖果机,咱们能够从上面的图中看到如果应用单纯的代码来实现上面的工作,就会呈现十分多难堪的状况,比方大量繁冗的if/else代码充斥,上面咱们来看下对于这个糖果机依照一般的形式要如何设计? 不应用设计模式 不应用设计模式的状况下,咱们通常的做法是定义状态常量,比方设置枚举或者间接设置final的标示位等等,咱们 首先咱们须要划分对象,糖果机和糖果,糖果机蕴含硬币的总钱数,糖果的数量等等。 定义四个状态:售罄,售出中,存在硬币,没有硬币为了实现状态的实现,咱们须要设计相似枚举的常量来示意糖果机的状态。 状态设置为常量,而糖果机须要内置机器的状态最初用逻辑代码和判断让糖果机外部进行工作,当然这会呈现巨多的if/else判断。 最初咱们的代码表现形式如下,用传统的模式咱们很可能写出相似的代码: MechanicaState:定义了糖果机的状态,当然能够作为糖果机的公有外部类定义应用,也能够设计为枚举,这里偷懒设计为一个常量类的模式。 /** * 机器状态 */public final class MechanicaState { /** * 售罄 */ public static final int SOLD_OUT = 0; /** * 存在硬币 */ public static final int HAS = 1; /** * 没有硬币 */ public static final int NOT = 2; /** * 售出糖果中 */ public static final int SOLD = 4;} CandyMechaica:糖果器,蕴含了糖果外部的工作办法,能够看到有十分多冗余的If/else判断: ...