代理简单介绍

生活中的代理:黄牛 【三个角色。我(真实对象)黄牛(代理对象)火车票(目的对象)】
代理模式出现的原因
  • 真实对象无法直接访问目的对象
  • 真实对象不想直接访问目的对象
  • 真实对象访问目的对象存在困难
解决的问题是:在直接访问对象时带来的问题 ,原先直接访问的两个类通过代理对象不在直接访问,可以实现解耦。
代理模式对应的UML图

图片描述

代理模式的分类

按照代理对象的创建时机划分为两种:
1、在编译前已经创建好对象,编译之后运行前代理类的.Class文件就已经存在,这种的称为静态代理
2、程序在运行的时候动态的创建代理对象,这种的称为动态代理

静态代理

在代码中手动的创建代理类。模拟的代码如 IDEA展示

/** * 定义一个接口 * 真实对象要干什么,代理对象通过接口可以知道 */public interface IUserDo {    void takeTrain(Ticket ticket);}/** * @author pangjianfei * @Date 2019/5/22 * @desc 真实对象 */public class RealUser implements IUserDo {    public final String NAME = "真实回家人";    @Override    public void takeTrain(Ticket ticket) {        System.out.println(NAME + " : 抢到票了,我要回家了,花了"+ ticket.proxyPrice.intValue() + "元,值了!");    }}/** * @author pangjianfei * @Date 2019/5/22 * @desc 代理角色,黄牛 */public class ProxyUser implements IUserDo{    public final String NAME = "黄牛";    /**代理的是哪一位*/    RealUser realUser;    public ProxyUser(RealUser realUser) {        this.realUser = realUser;    }    @Override    public void takeTrain(Ticket ticket) {        Ticket realTicket = buyTicket(ticket);        realUser.takeTrain(realTicket);        System.out.println(NAME + " : 我挣了" +(realTicket.proxyPrice.intValue()-realTicket.realPrice.intValue()) + "元");    }    public Ticket buyTicket(Ticket ticket) {        System.out.println(NAME + " : 去买从"+ticket.from+"到"+ticket.to+"的火车票了");        Ticket backHomeTicket = new Ticket();        backHomeTicket.setFrom(ticket.from);        backHomeTicket.setTo(ticket.to);        backHomeTicket.setTakeOffDate(ticket.takeOffDate);        backHomeTicket.setRealPrice(new BigDecimal(100));        backHomeTicket.setProxyPrice(new BigDecimal(120));        System.out.println(NAME + " : 购买成功");        return backHomeTicket;    }}