外观模式:简化子系统接口

版权申诉
0 下载量 86 浏览量 更新于2024-08-12 收藏 1.1MB PPT 举报
"第14章_外观模式.ppt" 外观模式是软件工程中的一种设计模式,它主要目的是为了简化客户端对复杂子系统交互的处理。在外观模式中,客户端(Client)与一个复杂的子系统之间的通信是通过一个统一的外观对象(Facade)来进行的。外观模式为子系统中的多个接口提供了一个统一的高层次接口,使得客户端可以更方便地使用子系统,降低了客户端和子系统之间的耦合度。 模式动机: 在大型软件系统中,通常会将复杂的功能分解为多个子系统,每个子系统都有自己的接口和实现。当客户端需要与这些子系统交互时,如果直接与每个子系统的组件进行通信,会导致代码复杂且难以维护。外观模式通过引入一个统一的外观对象,客户端只需要与这个对象交互,从而避免了直接与子系统的复杂交互,简化了系统的使用。 模式定义: 外观模式(Facade Pattern),也称作门面模式,其核心在于提供一个统一的接口,客户端通过这个接口与子系统进行交互。这使得子系统的使用变得简单,因为客户端无需理解子系统内部的复杂结构和实现细节。 模式结构: - 外观角色(Facade):作为客户端与子系统之间交互的接口,它封装了子系统中的一系列接口,并提供了统一的调用方式。 - 子系统角色(SubSystem):子系统可以有多个,它们是具体实现复杂功能的部分,每个子系统都有自己的接口和实现。 模式分析: - 单一职责原则:外观模式遵循这一原则,将客户端与子系统的复杂交互分离开,使得每个部分都专注于自己的职责。 - 迪米特法则:通过引入外观类,减少了不同模块之间的依赖,使得系统更加模块化,提高了可维护性和可扩展性。 模式效果与应用: 外观模式可以有效地降低系统的复杂性,使得客户端代码更简洁、易读。它常用于以下场景: 1. 当一个复杂的子系统需要被多个客户端使用时,可以创建一个外观类,提供一个简单的调用接口。 2. 当需要为一个已有系统添加新接口,而又不希望破坏现有客户端时,可以通过添加外观类来实现。 3. 在不同层次的组件需要交互,但又希望保持各层次之间的独立性时,外观模式能起到桥梁的作用。 模式扩展: 外观模式还可以与其他设计模式结合使用,如工厂模式可以用于创建外观对象,策略模式可以用来动态改变外观对象的行为。此外,还可以通过多重外观模式来为子系统提供多个不同的访问接口,以适应不同类型的客户端。 总结,外观模式是软件设计中的一种重要模式,它通过提供一个统一的接口,降低了客户端与复杂子系统之间的耦合,使得系统更加易于理解和维护。在实际开发中,合理运用外观模式能够提高代码的可读性和可维护性,降低系统的复杂度。

SELECT PIS.SHOW_FLT_DETAIL AS SHOW_FLT_DETAIL -- new , PIS.SHOW_AWB_DETAIL AS SHOW_AWB_DETAIL -- new , PIS.DISPLAY_AIRLINE_CODE AS CARRIER_CODE , DECODE(PIS.REVERT_FLOW,'N',PIS.FLOW_TYPE,DECODE(PIS.FLOW_TYPE,'I','E','I')) AS FLOW_TYPE , PIS.SHIP_TO_LOCATION AS SHIP_TO_LOCATION , PIS.INVOICE_SEQUENCE AS INVOICE_SEQUENCE , PFT.FLIGHT_DATE AS FLIGHT_DATE , PFT.FLIGHT_CARRIER_CODE AS FLIGHT_CARRIER_CODE , PFT.FLIGHT_SERIAL_NUMBER AS FLIGHT_SERIAL_NUMBER , PFT.FLOW_TYPE AS AIRCRAFT_FLOW , FAST.AIRCRAFT_SERVICE_TYPE AS AIRCRAFT_SERVICE_TYPE , PPT.AWB_NUMBER AS AWB_NUMBER , PPT.WEIGHT AS WEIGHT , PPT.CARGO_HANDLING_OPERATOR AS CARGO_HANDLING_OPERATOR , PPT.SHIPMENT_PACKING_TYPE AS SHIPMENT_PACKING_TYPE , PPT.SHIPMENT_FLOW_TYPE AS SHIPMENT_FLOW_TYPE , PPT.SHIPMENT_BUILD_TYPE AS SHIPMENT_BUILD_TYPE , PPT.SHIPMENT_CARGO_TYPE AS SHIPMENT_CARGO_TYPE , PPT.REVENUE_TYPE AS REVENUE_TYPE , PFT.JV_FLIGHT_CARRIER_CODE AS JV_FLIGHT_CARRIER_CODE , PPT.PORT_TONNAGE_UID AS PORT_TONNAGE_UID , PPT.AWB_UID AS AWB_UID , PIS.INVOICE_SEPARATION_UID AS INVOICE_SEPARATION_UID , PFT.FLIGHT_TONNAGE_UID AS FLIGHT_TONNAGE_UID FROM PN_FLT_TONNAGES PFT , FZ_AIRLINES FA , PN_TONNAGE_FLT_PORTS PTFP , PN_PORT_TONNAGES PPT , FF_AIRCRAFT_SERVICE_TYPES FAST , SR_PN_INVOICE_SEPARATIONS PIS --new , SR_PN_INVOICE_SEP_DETAILS PISD--new , SR_PN_INV_SEP_PORT_TONNAGES PISPT --new WHERE PFT.FLIGHT_OPERATION_DATE >= trunc( CASE :rundate WHEN TO_DATE('01/01/1900', 'DD/MM/YYYY') THEN ADD_MONTHS(SYSDATE,-1) ELSE ADD_MONTHS(:rundate,-1) END, 'MON') AND PFT.FLIGHT_OPERATION_DATE < trunc( CASE :rundate WHEN TO_DATE('01/01/1900', 'DD/MM/YYYY') THEN TRUNC(SYSDATE) ELSE TRUNC(:rundate) END, 'MON') AND PFT.TYPE IN ('C', 'F') AND PFT.RECORD_TYPE = 'M' AND (PFT.TERMINAL_OPERATOR NOT IN ('X', 'A') OR (PFT.TERMINAL_OPERATOR <> 'X' AND FA.CARRIER_CODE IN (SELECT * FROM SPECIAL_HANDLING_AIRLINE) AND PPT.REVENUE_TYPE IN (SELECT * FROM SPECIAL_REVENUE_TYPE) AND PPT.SHIPMENT_FLOW_TYPE IN (SELECT * FROM SPECIAL_SHIPMENT_FLOW_TYPE) AND PFT.FLIGHT_OPERATION_DATE >= (select EFF_DATE from SPECIAL_HANDLING_EFF_DATE) )) AND PFT.DELETING_DATETIME IS NULL AND FA.AIRLINE_UID = PFT.AIRLINE_UID AND FA.DELETING_DATETIME IS NULL AND PTFP.FLIGHT_TONNAGE_UID = PFT.FLIGHT_TONNAGE_UID AND PTFP.RECORD_TYPE = 'M' AND PTFP.DELETING_DATETIME IS NULL AND PPT.TONNAGE_FLIGHT_PORT_UID (+)= PTFP.TONNAGE_FLIGHT_PORT_UID AND PPT.RECORD_TYPE (+)= 'M' AND PPT.DISCREPANCY_TYPE (+)= 'NONE' AND PPT.ADJUSTMENT_INC_FLAG (+)= 'Y' AND PPT.DELETING_DATETIME (+) IS NULL AND FAST.AIRCRAFT_SERVICE_TYPE_UID = PFT.AIRCRAFT_SERVICE_TYPE_UID AND FAST.DELETING_DATETIME IS NULL AND PIS.TEMPORAL_NAME = TO_CHAR((CASE :rundate --new WHEN TO_DATE('01/01/1900', 'DD/MM/YYYY') THEN TRUNC(SYSDATE) ELSE TRUNC(:rundate) END ), 'YYYYMM') || '00' AND PIS.INVOICE_SEPARATION_UID = PISD.INVOICE_SEPARATION_UID --new AND PISD.INVOICE_SEP_DETAIL_UID = PISPT.INVOICE_SEP_DETAIL_UID --new AND PISPT.PORT_TONNAGE_UID = PPT.PORT_TONNAGE_UID --new AND PIS.PRINT_SUPPORTING_DOC = 'Y';上面是oracle的写法,请转成spark SQL的写法。

244 浏览量