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

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 代理模式实现代码及设计详解:动态代理模式、静态代理模式

    JAVA设计模式chm文档

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

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...

    java设计模式【之】JDK动态代理【源码】【场景:帮爸爸买菜】.rar

    java设计模式【之】JDK动态代理【源码】【场景:帮爸爸买菜】.rar /** * 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法...

    JAVA设计模式之结构模式

    这是JAVA设计模式中属于结构模式的部分,包括Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade (外观模式)的源代码。其中有些模式中...

    33种JAVA设计模式DEMO

    代理模式(Proxy Pattern) 3 行为型模式 这些设计模式特别关注对象之间的通信。 责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式(Interpreter Pattern) 迭代器模式...

    JAVA设计模式(代理模式)

    代理模式又叫Proxy模式(英文)。所谓的代理,就是一个人或者一个机构代替另一个人或者另一个机构去做一些事情。(类似于中介或者代理商)。

    java常用设计模式及JDK与CGLIB实现动态代理区别(源码)

    java常用设计模式及JDK与CGLIB实现动态代理区别(源码) /** * 使用cglib动态代理 * @author * */ public class BookFacadeProxy implements MethodInterceptor{ private Object target; @Override public...

    详解设计模式中的proxy代理模式及在Java程序中的实现

    详解设计模式中的proxy代理模式及在Java程序中的实现共14页.pdf.zip

    面向对象初学者必须掌握的几种设计模式

    观察者模式 Observer:Swing中的事件模型 工厂模式 Factory:在JDK中遍地都是,比如JDBC、JNDI等,是...Strategy:java.util.Comparator就用到了它 代理模式 Proxy:学习Spring IoC容器必须掌握的模式 <br>

    java设计模式教程+源代码

    Proxy ( 代理模式 ) Chain of Responsibility ( 责任链模式 ) Command ( 命令模式 ) Interpreter ( 解释器模式 ) Iterator ( 迭代器模式 ) Mediator ( 中介者模式 ) Memento ( 备忘录模式 ) Observer ( 观察...

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...

    23种设计模式的实现(Java 版),java设计模式

    Factory模式,Prototype模式,Builder 模式,Singleton模式,Facade模式,Proxy模式,Adapter模式,Composite模式,Decorator模式....

    apache开源项目源码commons-proxy-1.0-src(全部高质量代理模式proxy的java源程序)

    全部高质量代理模式proxy的java源程序 java.proxy,代理模式源码,设计模式,apache开源项目源码commons-proxy-1.0-src 各种代理模式操作的工具类源码以及代理模式案例源码,你会从中得到意想不到的效果! apache...

    java 常用设计模式chm

    设计模式中定义: 为其他对象提供一种代理以控制对这个对象的访问. 为什么要使用Proxy? 1.授权机制 不同级别的用户对同一对象拥有不同的访问权利,如Jive论坛系统中,就使用Proxy进行授权机制控制,访问论坛有两种人:...

    java实现Proxy例子

    我自己用eclipse写的java代码,可以直接用eclipse导入,也可以直接用java -jar proxy_sample.jar执行 代码量很小,尽量通过注释进行说明 本例实现了InvocationHandler...在研究代理模式(Proxy模式)的朋友可以交流一下

    java代理模式

    java设计模式,代理模式

    设计模式专题,代理模式,工厂模式

    设计模式专题,代理模式,工厂模式

    JAVA设计模式-day2.pdf

    JAVA设计模式-day2,请的行业大能讲得课程,涉及:创建模式(5种: 1、 工厂方法模式(Factory Method); 2、 抽象工厂模式; 3、 单例模式(Singleton) • 4、 建造者模式(Builder); 5、 原型模式(Prototype...

    Java面试 java设计模式整理 单例、工厂、策略等 面试使用,学习使用

    java的设计模式大体上分为三大类: 2 设计模式遵循的原则有6个: 2 1. 工厂模式(Factory Method) 2 2. 抽象工厂模式(Abstract Factory) 3 3. 单例模式(Singleton) 4 4.建造者模式(Builder) 4 5. 原型模式...

Global site tag (gtag.js) - Google Analytics