设计模式-结构型模式-代理模式proxy

代理模式 三个角色:抽象主题  具体主题 代理类 ( 抽象主题约束)
代理主要是 给某个对象提供一个代理以控制对该对象的访问。  类似于   中介

静态代理 :直接提供代理类,实现与具体主题(被代理类)一样的接口  new 代理类 去掉用重写的方法   

package com.qf.proxydemo.staticproxy;

//抽象主题,定义具体具体与代理类 实现的业务方法

public interface SellTickets {

    //卖票方法
    void sell();
}


package com.qf.proxydemo.staticproxy;

//具体主题 被代理类
public class TrainStation implements SellTickets {
    @Override
    public void sell() {
        System.out.println("火车站卖票");
    }
}


package com.qf.proxydemo.staticproxy;

//代售点
//代理类 proxy 与具体主题实现一样的业务
//实现一个 接口 是代理的思想   客户是对一个接口的功能感兴趣 所以要保证 实现同一个功能
public class ProxyPoint implements SellTickets {
    //被代理类对象
    private TrainStation trainStation = new TrainStation();

    @Override
    public void sell() {
        System.out.println("代售点收取一点手续费");
        //被代理类方法
        trainStation.sell();
    }
}


package com.qf.proxydemo.staticproxy;

//静态代理测试

/**
 * 直接访问代理类 但是代理类 实现了与 被代理类(具体主题)一样的接口
 */
public class Client {
    public static void main(String[] args) {
        ProxyPoint proxyPoint = new ProxyPoint();
        proxyPoint.sell();
    }
}

JDK代理

 

package com.qf.proxydemo.jdkproxy;

//卖票的业务  被代理类与代理类都要实现的接口
public interface SellTickets {

    //卖票的功能
    void sell();

}


package com.qf.proxydemo.jdkproxy;

//真是主题  被代理类对象
public class TrainStation implements SellTickets {
    @Override
    public void sell() {
        System.out.println("车站卖票");
    }
}


package com.qf.proxydemo.jdkproxy;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//代理工厂 用来生成代理类对象(真是主题对象)  不是代理类 只是提供代理类的创建
//需要 调用jdk 提供的proxy 类中的 一个newInstance方法
public class ProxyFactoryTwo implements InvocationHandler {
    //真是主题对象
    private TrainStation station = new TrainStation();

    public SellTickets getProxyObjectTwo() {
        return (SellTickets)
                Proxy.newProxyInstance(station.getClass().getClassLoader(),
                        station.getClass().getInterfaces(), this);
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("收取一定的费用");
        Object invoke = method.invoke(station, args);
        return invoke;
    }
}



package com.qf.proxydemo.jdkproxy;


//测试
public class Client {
    public static void main(String[] args) {
//        ProxyFactory factory = new ProxyFactory();
//        SellTickets proxyObject = factory.getProxyObject();
//        proxyObject.sell();
        //获得代理工厂
        ProxyFactoryTwo proxyFactoryTwo = new ProxyFactoryTwo();
        //获得代理对象
        SellTickets sellTickets = proxyFactoryTwo.getProxyObjectTwo();
        sellTickets.sell();

    }
}

还有一个cglb代理 略

总结 :代理模式 主要注重的是提供代理类工厂 去产生代理对象(程序运行中动态生成),

隔离了 目标对象与访问对象  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值