代理模式

代理模式:

                      一.静态代理                二.动态代理

静态代理思想:

        主要理解抽象角色,真实角色,代理角色,客户端

        假如我去租房子,方式为找中介。真正租房子的是房东给你租的,但你接触的是中介,中介不会租房子给你。但除了租房子外所有的事情都是中介来处理,这就是代理模式思想。根据这段话编写代码:

        事情是什么?房东和中介一直在关注什么事。那就是租房子。所以我们可以编写他俩共同关注的事件,可以为接口,也可以为抽象类。     抽象角色

public interface House {
    public void rent();
}

       租房子事件出来了,谁去真真正正的给你租房子,应该是房东。所以房东为真实角色。编写代码让房东去租房子。

public class LandlordImpl implements House {
    
    @Override
    public void rent() {
        System.out.println("房东进行租房子");    
    }
}

      上面说的,我们需要通过中介来租房子,所以中介这时候需要把房东拉来,告诉房东有客户了。房子谈成功后就要签订手续,办理合同,这些一系列操作都可以通过中介未来完成。这系列操作称为公共业务。这样中介成为代理角色

public class ProxyLandlord implements House {
    private LandlordImpl landlord;
    public void setLandlord(LandlordImpl landlord) {
        this.landlord = landlord;
    }
    @Override
    public void rent() {
        //中介签合同
        contract();
        //房东租房子
        landlord.rent();
    }
    public void contract(){
        System.out.println("中介签合同");
    }
}

     我进行租房子时,需要房东与中介,房东是真正租房子给我,中介完成了签合同,协商,沟通等操作。

public class Main {
    public static void main(String[] args) {
        //new出来一个真实角色,房东。
        LandlordImpl landlord =new LandlordImpl();
        //new出来一个代理角色,中介。
        ProxyLandlord proxyLandlord = new ProxyLandlord();
        //中介把房东找来
        proxyLandlord.setLandlord(landlord);
        //进行租房子事件
        proxyLandlord.rent();
    }
}

测试结果:

代理模式好处:

        可以使真实角色的操作更加纯粹,不用关注公共的业务,公共的业务交给了代理角色,实现了业务的分工。

        公共业务发生扩展时,方便集中管理

        缺点:

        一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率低。

动态代理思想:

        动态代理和静态代理角色一样。

        动态代理的代理类是动态生成的,不是我们直接写好的。

        理解俩大类:

        1.proxy:生成动态代理实例  

        2.InvocationHandler: 调用处理程序,并返回结果。

1.抽象角色,事件为租房子.

public interface House {
    public void rent();
}

2.真实角色,事件为真正租房子

public class LandlordImpl implements House {
    @Override
    public void rent() {
        System.out.println("房东出租房子");
    }
}

3.写一个InvocationHandler实现类,它的作用是1.通过客户端获取到真实角色,真正获取的是接口对象。根据接口对象可自动生成代理实例,并返回。2.利用反射机制invoke方法处理代理实例,并返回结果。

//自动生成代理类
public class InvocationHandlerImpl implements InvocationHandler {

    //被代理的接口
    private Object target;

    public void setTarget(Object target) {
        this.target = target;
    }

    //生成得到代理类
    public Object getproxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),
                target.getClass().getInterfaces(),this);
    }

    //处理代理实例,并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //动态代理的本质,就是使用反射机制实现的!
        Object invoke = method.invoke(target, args);
        return invoke;
    }
}

客户端执行:

public class Main {
    public static void main(String[] args) {
        //new出来一个真实角色,房东。
        LandlordImpl landlord =new LandlordImpl();
        InvocationHandlerImpl invocationHandler = new InvocationHandlerImpl();
        //通过invocationHandler实现类调用真实角色来处理我们要调用的接口对象!
        invocationHandler.setTarget(landlord);
        //获得代理类
        House proxy = (House) invocationHandler.getproxy();
        //这里的proxy代理类是我们动态生成的
        proxy.rent();
    }
}

结果示例:

代理模式好处:

        可以使真实角色的操作更加纯粹,不用关注公共的业务,公共的业务交给了代理角色,实现了业务的分工。

        公共业务发生扩展时,方便集中管理。

        一个动态代理类代理的是一个接口,一般就是对应的一类业务。

        一个动态代理类可以代理多个类,只要是实现了同一个接口。

举例:张三租房,他是房东,属于真实角色。抽象角色也为租房。生成代理类可以代理张三去租房子。

           而李四也租房,他是房东,属于真实角色。抽象角色也为租房。生成代理类可以代理李四去租房子。

           共同点:实现了同一接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值