`
youyu4
  • 浏览: 440481 次
社区版块
存档分类
最新评论

Java设计模式六:代理模式(Proxy)

 
阅读更多

为另一个对象提供一个替身或占位符以控制对这个对象的访问,简而言之就是用一个对象来代表另一个对象。
类图:


简单例子:有个接口Italk,people对象实现这个接口的talk()方法,有些想另外加入sing()方法,所以增加代理类talkProxy,实现两个方法.
public interface ITalk
{
    public void talk(String msg);
}

public class People implements ITalk
{
    @Override
    public void talk(final String msg)
    {
        System.out.println(msg);
    }
}

public class TalkProxy implements ITalk
{
    ITalk italk;

    public TalkProxy(final ITalk italk)
    {
        this.italk = italk;
    }

    @Override
    public void talk(final String msg)
    {
        this.italk.talk(msg);
    }

    public void sing(final String songName)
    {
        System.out.println("Song Name:" + songName);
    }
}

public class Client
{
    public static void main(final String[] args)
    {
        final People people = new People();
        people.talk("I can't sing");

        final TalkProxy proxy = new TalkProxy(people);
        proxy.talk("I can talk");
        proxy.sing("I can sing");
    }
}

结果:
I can't sing
I can talk
Song Name:I can sing

常见的代理:
1. 远程代理(Remote Proxy):为一个位于不同的地址空间的对象提供一个本地的代理对象。这个不同的地址空间可以是在同一台主机中,也

可是在另一台主机中,远程代理又叫做大使(Ambassador)。
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface MyRemote extends Remote
{
    public String getUserName(String userId) throws RemoteException;
}

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class MyRemoteImp extends UnicastRemoteObject implements MyRemote
{
    protected MyRemoteImp() throws RemoteException
    {
        
    }

    public String getUserName(String userId) throws RemoteException
    {
        return userId + "/myName is Cherry";
    }

}

在cmd中输入:
javac MyRemote.java
javac MyRemoteImp.java
rmic MyRemoteImp
生成类的class文件及MyRemoteImp_Stub.class文件


import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
public class MyRemoteServer
{
    public static void main(final String[] args)
    {
        // YTODO Auto-generated method stub
        MyRemote remote;
        try
        {
            remote = new MyRemoteImp();
            Naming.rebind("RemoteService", remote);
        }
        catch (final RemoteException e)
        {
            // YTODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (final MalformedURLException e)
        {
            // YTODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
public class MyRemoteClient
{
    public static void main(final String[] args)
    {
        try
        {
            final MyRemote service = (MyRemote) Naming.lookup("rmi://127.0.0.1/RemoteService");
            final String name = service.getUserName("my id is 001");
            System.out.println(name);
        }
        catch (final MalformedURLException e)
        {
            e.printStackTrace();
        }
        catch (final RemoteException e)
        {
            e.printStackTrace();
        }
        catch (final NotBoundException e)
        {
            e.printStackTrace();
        }
    }

}

在dos下运行rmiregistry, 这个命令是开启RMI注册服务, 开启以后我们的server程序才能调用rebing方法发布我们的类,然后运行server程序

.
javac MyRemoteServer.java
java MyRemoteServer

start rmiregistry
javac MyRemoteServer.java
java MyRemoteServer

再打开一个dos运行客户端代码
javac MyRemoteClient.java
java MyRemoteClient

输出:my id is 001/myName is Cherry

这里一共有三个dos窗口, 当执行start rmiregistry时,会弹出它的窗口,当执行java MyRemoteServer的服务器端窗口,执行java 

MyRemoteClient的客户端窗口(这里的rmiregistry.exe的窗口需要一直打开,否则无法调用服务器端).

2. 虚拟代理(Virtual Proxy):根据需要创建开销很大的对象。如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表

示,真实对象只会在需要时才会被真正创建。
public interface Image
{
    public void show();
}

public class BigImage implements Image
{
    public BigImage()
    {
        //Thread.sleep(3000);//for simulating to load the big images
        System.out.println("create the big images");
    }

    @Override
    public void show()
    {
        System.out.println("show the big images");
    }
}

public class ImageProxy implements Image
{
    Image image;

    public ImageProxy()
    {

    }

    public ImageProxy(final Image image)
    {
        this.image = image;
    }

    @Override
    public void show()
    {
        if (this.image == null)
        {
            this.image = new BigImage();
        }
        this.image.show();
    }
}

public class Client
{
    public static void main(final String[] args)
    {
        System.out.println("big image:");
        final Image bigImage = new BigImage();
        bigImage.show();

        System.out.println("image proxy:");
        final Image imageProxy = new ImageProxy();
        imageProxy.show();
    }
}
结果:
create the big images
show the big images
image proxy:
create the big images
show the big images

3. Copy-on-Write代理: 虚拟代理的一种,把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。

4. 保护代理(Protection or Access Proxy):控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。

5. 智能指引(Smart Reference):取代了简单的指针,它在访问对象时执行一些附加操作.

分享到:
评论

相关推荐

    java 设计模式之代理模式(Proxy Pattern)实现代码及设计详解:动态代理模式、静态代理模式

    Java设计模式是软件开发中的重要概念,它提供了一套通用的解决方案模板,使得代码更加可复用、可扩展。在这些模式中,代理模式(Proxy Pattern)是一种常用的结构型设计模式,它允许我们为一个对象创建一个代理,该...

    Java设计模式——代理设计模式(静态代理和动态代理)

    在Java编程中,设计模式是一种解决常见问题的模板或最佳实践,它可以帮助开发者编写更加灵活、可维护和可扩展的代码。代理设计模式是其中的一种,它的主要作用是在不修改原有对象的基础上,为对象添加额外的功能或者...

    23种java设计模式.pdf

    " JAVA 设计模式概述" JAVA 设计模式是指在软件设计过程中,为了提高代码的可维护性、灵活性和可扩展性所使用的一些惯用解决方案。JAVA 设计模式可以分为三种:创建模式、结构模式和行为模式。 1. 创建模式 创建...

    JAVA设计模式之代理模式实例

    在Java编程领域,设计模式是一种解决常见问题的模板或最佳实践,它被广泛应用于软件开发中以提高代码的可读性、可维护性和可扩展性。代理模式是设计模式的一种,它提供了一种对目标对象进行增强或者控制访问的方式。...

    Java设计模式-代理模式例子

    在这个“Java设计模式-代理模式例子”中,我们可能能看到如何创建静态代理类,以及如何利用`Proxy`和`InvocationHandler`创建动态代理。源码分析可以帮助我们更好地理解代理模式的实现细节,并能将其运用到自己的...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    Java设计模式是软件工程中的一种最佳实践,它总结了在特定场景下解决常见问题的经验,为程序员提供了可重用的解决方案。本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与...

    JAVA设计模式chm文档

    设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制...

    JAVA设计模式(代理模式)

    **Java设计模式——代理模式详解** 代理模式是软件设计模式中的一个重要组成部分,它在Java编程中扮演着举足轻重的角色。代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象可以控制对原...

    设计模式之代理模式proxy

    **设计模式之代理模式(Proxy Pattern)** 设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的模板。代理模式是其中一种行为设计模式,它的核心思想是为一个对象提供一个替身或者代理,以控制对...

    Java设计模式之代理模式(结构)

    ### Java设计模式之虚拟代理模式详解 #### 一、引言 在软件工程领域,设计模式作为一种被广泛接受的最佳实践,对于提高代码质量和可维护性起着至关重要的作用。其中,“代理模式”作为结构型设计模式之一,在解决...

    java23种设计模式详解+源码(绝对详解)

    - 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。 - 外观模式(Facade):为子系统提供一个统一的接口,使子系统更加易用。 - 适配器模式(Adapter):将一个类的接口转换成客户希望的另一...

    《Java设计模式》课后答案-刘伟.rar

    《Java设计模式》是刘伟教授的一本关于设计模式的教材,主要面向高等学校的学生和对Java编程有深入兴趣的开发者。设计模式是软件工程中的一种重要思想,它封装了在特定场景下的问题解决方案,可以提高代码的可读性、...

    java设计模式程序源代码

    Java设计模式是软件工程中的一种最佳实践,它提供了一种在特定情况下解决常见问题的模板。这些模式在软件开发中被广泛使用,因为它们能够使代码更可读、可维护和可扩展。在这个名为"java设计模式程序源代码"的压缩包...

    java设计模式视频教程-代理模式.rar

    在这个“java设计模式视频教程-代理模式.rar”压缩包中,包含了一部关于代理模式的视频教程,以及相关的课件和示例代码。 代理模式的核心思想是通过代理类来代理原始对象,为原始对象提供一个替代品或占位符,以...

    JAVA设计模式-chm版

    Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...

    java设计模式ppt

    ### Java设计模式详解 在软件开发领域,设计模式是一种被广泛采用的解决方案,用来解决常见的设计问题。设计模式不仅能够帮助开发者写出可复用、可维护的代码,还能提高团队间的沟通效率。以下是对给定文件中提到的...

    Java设计模式-代理模式

    总结来说,Java设计模式中的代理模式提供了一种优雅的方式来控制对目标对象的访问,并扩展其功能。动态代理更是使得这一过程更加灵活,降低了代码的维护成本。通过学习和应用代理模式,开发者可以更好地设计和实现...

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂

    在软件开发中,设计模式是解决常见问题的模板或最佳实践,它们被广泛应用于Java和其他面向对象编程语言中。以下是对标题和描述中提到的一些关键设计模式的详细解释: 1. **MVC模式(Model-View-Controller)**:这...

    JAVA设计模式.pdf

    ### JAVA设计模式详解 #### 一、引言:学习GOF设计模式的重要性 设计模式是在软件工程领域中解决常见问题的一系列解决方案。Gang of Four(GOF)的经典著作《设计模式:可复用面向对象软件的基础》为软件开发者...

    JAVA设计模式(chm版)

    2. 结构型模式:关注对象组合和类的继承,例如适配器模式(Adapter)、装饰器模式(Decorator)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)。...

Global site tag (gtag.js) - Google Analytics