代理模式:中介与增强功能

版权申诉
0 下载量 164 浏览量 更新于2024-08-12 1 收藏 1.28MB PPT 举报
"第16章_代理模式.ppt" 代理模式是软件设计模式中的一种对象结构型模式,它的核心思想是在目标对象和客户端之间引入一个代理对象,这个代理对象控制着对目标对象的访问。代理模式的主要动机是提供一种方式来间接引用目标对象,以实现对客户隐藏真实对象的一些细节,同时可以增加额外的功能或控制。 模式的动机主要体现在以下几个方面: 1. **保护目标对象**:客户可能不需要或者不应该直接访问真实对象的所有功能,代理可以作为保护层,只暴露必要的接口给客户,隐藏其他细节。 2. **增强功能**:代理对象可以在执行目标对象的操作之前和之后添加额外的行为,比如权限检查、日志记录、性能监控等。 3. **远程代理**:在分布式系统中,代理对象可以代表位于不同网络节点上的真实对象,使得客户端可以像操作本地对象一样操作远程对象。 4. **虚拟代理**:在需要创建开销较大的对象时,可以先用一个小对象(代理)代替,等到真正需要时再创建真实对象。 5. **智能引用**:代理对象可以提供一些额外的信息或服务,比如对象的状态、统计信息等。 代理模式的定义明确指出,它为某一个对象提供一个代理,通过这个代理对象来控制对原对象的引用。代理对象通常实现了与真实对象相同的接口,以便于客户端透明地调用。 模式结构包括以下角色: - **Subject(抽象主题角色)**:定义了客户端和真实主题的共同接口,这样客户端就可以在不了解真实主题的情况下进行调用。 - **Proxy(代理主题角色)**:实现了Subject接口,持有对RealSubject的引用,负责对RealSubject的请求进行转发,并且可以添加额外的行为。 - **RealSubject(真实主题角色)**:实际业务处理的对象,实现了Subject接口,提供了具体的功能实现。 代理模式的实现通常涉及对真实对象的封装,代理类在调用真实对象的方法前后可以插入自定义的逻辑。以下是一个简单的Java代理类的示例: ```java public class Proxy implements Subject { private RealSubject realSubject; public Proxy() { this.realSubject = new RealSubject(); } @Override public void request() { preRequest(); realSubject.request(); postRequest(); } private void preRequest() { // 执行预处理逻辑 } private void postRequest() { // 执行后处理逻辑 } } ``` 在这个例子中,`Proxy`类作为代理,它实现了`Subject`接口,并持有`RealSubject`的实例。当`Proxy`的`request()`方法被调用时,会先执行预处理逻辑,然后调用`RealSubject`的`request()`方法,最后执行后处理逻辑。 代理模式在软件开发中有着广泛的应用,例如在JDBC中的Statement和PreparedStatement就是一种代理,它们为数据库的SQL执行提供了代理;Spring AOP框架中的代理也是一大经典应用场景,它允许在方法调用前后插入拦截逻辑,实现事务管理、安全控制等功能。 代理模式是一种非常实用的设计模式,它能够帮助我们更好地控制对象的访问,提供额外的服务,以及在不影响原有系统结构的情况下扩展系统功能。在实际开发中,根据具体的场景选择合适的代理类型,如静态代理、动态代理等,可以有效地提高系统的灵活性和可维护性。

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的写法。

2023-06-02 上传