行为型模式-状态模式解析

需积分: 9 0 下载量 37 浏览量 更新于2024-08-12 收藏 52KB MD 举报
"这篇文档是关于设计模式的学习笔记,特别是状态模式的应用实例。它通过一个电梯控制系统来阐述状态模式的概念,展示了如何用代码实现不同状态的转换和相应操作。" 在设计模式中,状态模式是一种行为型模式,它允许对象在其内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于当对象的行为依赖于它的状态(或条件)并且它必须在运行时改变状态时。 6.5.1 概述 状态模式的关键在于定义一系列的类,每个类都代表系统中的一种状态,并且实现该状态下对象可以执行的操作。在给定的例子中,电梯有四种状态:开门(OPENING_STATE)、关门(CLOSING_STATE)、运行(RUNNING_STATE)和停止(STOPPING_STATE)。每个状态的改变都会触发不同的行为。 类图中的ILift接口定义了电梯的公共行为,包括设置状态(setState)、开门(open)、关门(close)、运行(run)和停止(stop)这些方法。接口的实现类 Lift 实际上代表了电梯对象,其中包含表示当前状态的变量。 在代码实现部分,`Lift` 类实现了 `ILift` 接口,并且有一个 `setState` 方法用于改变状态。例如,当调用 `close` 方法时,会根据当前状态进行不同的处理。如果电梯处于开门状态,会执行关门操作并切换到关门状态;如果已经在关门、运行或停止状态,则不执行任何操作,因为这些状态下电梯门是关闭的。 状态模式的优点包括: 1. 封装了转换规则:状态模式把引起对象状态转换的事件封装到了状态对象中,使得这些转换逻辑与对象本身分离,提高了代码的可维护性和可扩展性。 2. 让对象的行为依赖于它的状态:每个状态类都代表一种特定的行为,使得代码更清晰,易于理解。 3. 支持状态间的切换:状态模式支持在运行时动态地改变对象的行为,使得系统更加灵活。 然而,状态模式也存在潜在的缺点,如增加系统的复杂性,过多的状态类可能导致代码膨胀,以及状态转换的管理可能会变得复杂。 在实际开发中,状态模式常用于处理具有多种状态并根据状态改变行为的对象,例如游戏角色的状态(攻击、防御、移动等)、数据库连接的状态(连接、断开、读写等)或者用户界面的交互状态等。正确使用状态模式可以帮助我们更好地管理和组织代码,提高代码的可读性和可维护性。

set hive.exec.dynamic.partition.mode=nonstrict; set hive.exec.parallel=true; set hive.exec.parallel.thread.number=30; --drop table if exists dm_finrisk.dm_event_walletSettleSuccessEvent_di; create table if not exists dm_finrisk.dm_event_cashLoanEvent_di( event_uuid string ,event_code string ,dt string ,event_time string ,rawSnapshot string ) COMMENT 'cashLoanEvent' PARTITIONED BY ( day bigint)stored as parquet; drop table if exists tmp.tmp_dm_event_cashLoanEvent_di_01_${zdt.addDay(-1).format("yyyyMMdd")}; create table if not exists tmp.tmp_dm_event_cashLoanEvent_di_01_${zdt.addDay(-1).format("yyyyMMdd")} as select uuid as event_uuid ,event as event_code ,from_unixtime(unix_timestamp(cast(day as string),'yyyymmdd'),'yyyy-mm-dd') as dt ,from_unixtime(cast(cast(`time` AS BIGINT)/1000 AS BIGINT),'yyyy-MM-dd HH:mm:ss') as event_time ,get_json_object(data,'$.hotPublish.rawSnapshot') as rawSnapshot from dm_finrisk.ods_event_hdfs_snapshot_di where code = 'shield@cashLoanEvent' and day=${zdt.addDay(-1).format("yyyyMMdd")} drop table if exists tmp.tmp_dm_event_cashLoanEvent_di_02_${zdt.addDay(-1).format("yyyyMMdd")}; create table if not exists tmp.tmp_dm_event_cashLoanEvent_di_02_${zdt.addDay(-1).format("yyyyMMdd")} as select event_uuid ,event_code ,dt ,event_time ,rawSnapshot from tmp.tmp_dm_event_cashLoanEvent_di_01_${zdt.addDay(-1).format("yyyyMMdd")}; alter table dm_finrisk.dm_event_cashLoanEvent_di drop if exists partition (day = ${zdt.addDay(-1).format("yyyyMMdd")}); insert overwrite table dm_finrisk.dm_event_cashLoanEvent_di partition (day = ${zdt.addDay(-1).format("yyyyMMdd")}) select event_uuid ,event_code ,dt ,event_time ,rawSnapshot from tmp.tmp_dm_event_cashLoanEvent_di_02_${zdt.addDay(-1).format("yyyyMMdd")}分析下上面代码

2023-06-08 上传