栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

设计模式之代理模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式之代理模式

代理模式
  • 介绍
  • 静态代理
  • 动态代理

介绍

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。

代理模式的主要优缺点:

  • 代理模式会造成系统设计中类的数量增加
  • 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
  • 增加了系统的复杂度;
静态代理

Java中的静态代理要求代理类和委托类都实现同一个接口。静态代理中代理类在编译期就已经确定,静态代理的效率相对动态代理来说相对高一些,但是静态代理代码冗余大,一但需要修改接口,代理类和委托类都需要修改。

角色分析:

抽象角色:一般会使用接口或抽象类来解决
真实角色:被代理的角色
代理角色:代理真实角色,代理真实角色后 一般会做一些附属操作
客户:访问代理对象的人

//租房 (抽象角色)
public interface Rent {
 
    public void rent();
}
//房东类 (真实角色)
public class Host implements Rent {
 
    @Override
    public void rent() {
        System.out.println("房东要出租房子");
    }
}
//代理类 (代理角色)
public class Proxy {
 
    private Host host;
    public Proxy(){
    }
    public Proxy(Host host) {
        this.host = host;
    }
 
    public void rent(){
        host.rent();
    }
 
    //看房
    public void seeHouse(){
        System.out.println("中介带你看房");
    }
 
    //签合同
    public void hetong(){
        System.out.println("签租赁合同");
    }
 
    //收中介费
    public void fare(){
        System.out.println("收中介费");
    }
}
//客户类
public class Client {
    public static void main(String[] args) {
        //房东要租房子
        Host host = new Host();
 
        //代理,中介帮房东租房子,代理还有一些附属操作
        Proxy proxy = new Proxy(host);
        //不用面对房东,直接找中介租房
        proxy.rent();
 
        proxy.seeHouse();
        proxy.hetong();
    }
}
动态代理

动态代理在程序运行时,运用反射机制动态创建而成。
特点:

动态代理和静态代理角色一样
动态代理的代理类是动态生成的,不是我们直接写好的
动态代理分为两大类:基于接口的动态代理、基于类的动态代理

//租房
public interface Rent {
 
    public void rent();
}
//房东类
public class Host implements Rent {
 
    @Override
    public void rent() {
        System.out.println("房东要出租房子");
    }
}
//用这个类自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {
 
    //被代理的接口
    private Rent rent;
 
    public void setRent(Rent rent){
        this.rent = rent;
    }
 
    //生成得到代理类
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),
                rent.getClass().getInterfaces(),this);
    }
 
    //处理代理实例,并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //动态代理的本质,就是使用反射机制实现
        seeHouse();
        Object result = method.invoke(rent, args);
        fare();
        return result;
    }
 
    public void seeHouse(){
        System.out.println("中介带看房子");
    }
 
    public void fare(){
        System.out.println("收中介费");
    }
}
//实现类
public class Client {
    public static void main(String[] args) {
        //真实角色
        Rent host = new Host();
 
        //代理角色
        ProxyInvocationHandler pih = new ProxyInvocationHandler();
        //通过调用程序处理角色来处理我们要调用的接口对象
        pih.setRent(host);
        //这里的proxy就是动态生成的
        Rent proxy = (Rent) pih.getProxy();
        proxy.rent();
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/677324.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号