Java設(shè)計(jì)模式之代理模式篇

字號:

在軟件工程中,代理模式(Proxy Pattern)在很多情況下都非常有用。例如在Java XML保重,開發(fā)人員可以利用代理來訪問Web服務(wù)。例1中演示了經(jīng)典的Hello       World Web服務(wù)的例子:
     例1 一個(gè)SOAP代理的例子
     public class HelloClient {
     public static void main(String[] args) {
     try {
     HelloIF_Stub proxy = (HelloIF_Stub)(new HelloWorldImpl().getHelloIF());
     proxy._setTargetEndpoint(args[0]);
     System.out.println(proxy.sayHello("Hello World!"));
     } catch (Exception ex) {
     ex.printStackTrace();
     }
     }
     }
     在例一中,客戶端首先獲得對代理的引用,然后利用命令行參數(shù)設(shè)定代理的端點(diǎn)(即Web服務(wù)的URL地址),接下來調(diào)用代理的sayHello()方法,代理再將方法調(diào)用傳遞給相應(yīng)的Web服務(wù)。
     代理模式和修飾模式(Decorator Pattern)有一定的相似之處。兩個(gè)模式又使用了代理將方法調(diào)用傳遞給另一個(gè)對象,該對象被稱為真實(shí)對象(Real Subject)。代理模式和修飾模式的不同之處在于:在代理模式中,代理和真實(shí)對象之間的關(guān)系在程序被編譯的時(shí)候就確定下來了,而修飾模式則是在運(yùn)行時(shí)遞歸地創(chuàng)建。
     本文首先提供一個(gè)ImageIcon的例子來說明代理模式,然后會探討一下JDK是如何支持代理模式的。
     代理模式
     代理模式通過使用代理來替代實(shí)際的對象,使程序能夠控制對該對象的訪問。下面是一個(gè)ImageIcon的例子。
     例2 ImageIcon的例子
     import java.awt.*;
     import java.awt.event.*;
     import javax.swing.*;
     public class IconTest extends JFrame {
     private static String IMAGE_NAME = "hands.jpg";
     private static int FRAME_X = 150, FRAME_Y = 200,
     FRAME_WIDTH = 430, FRAME_HEIGHT = 392;
     private Icon imageIcon = null, imageIconProxy = null;
     static public void main(String args[]) {
     IconTest app = new IconTest();
     app.show();
     }
     public IconTest() {
     super("ImageIcon測試");
     imageIcon = new ImageIcon(IMAGE_NAME);
     setBounds(FRAME_X, FRAME_Y, FRAME_WIDTH, FRAME_HEIGHT);
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     }
     public void paint(Graphics g) {
     super.paint(g);
     Insets insets = getInsets();
     imageIcon.paintIcon(this, g, insets.left, insets.top);
     }