设计模式之代理模式!

大家好,欢迎来到程序视点!上一篇文章我们讲了适配器模式(Simple Factory)适配器模式有三类:类的适配器模式、对象的适配器模式、接口的适配器模式。

它们的区别就是:以何种方式把要适配的资源给到适配器

它们分别是:以类的方式继承,以对象的方式持有和以接口(抽象)的方式实现。

我们说过:适配器模式的特点是可以让任何两个没有关联的类一起运行.

今天我们来看下代理模式。它就是让两个有关联的类一起运行

代理模式简介

代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

使用代理模式的情况是,当访问对象不适合或者不能直接引用目标对象,我们生成一个代理对象作为访问对象和目标对象之间的中介。

通俗的来讲代理模式就是我们生活中常见的中介。通过对定义的理解,我们可以抽象出其中主要的角色:

  • 抽象主题(Subject)类(业务接口类):通过接口或抽象类声明真实主题和代理对象实现的业务方法,服务端需要实现该方法。

  • 真实主题(Real Subject)类(业务实现类):实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。

  • 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

代理模式分为三类:1. 静态代理 2. 动态代理 3. CGLIB代理;今天我们主要解析静态代理

静态代理

我们按照前面的定义来实现这三个角色类。以租房为例,我们一般用租房软件、找中介或者找房东。这里的中介就是代理者。首先定义一个提供了租房方法的接口--抽象主题

复制代码
    void rentHouse();  
}  

定义租房的实现类--真实主题

复制代码
public class RentHouse implements IRentHouse {  
    @Override  
    public void rentHouse() {  
        System.out.println("租了一间房子。。。");  
    }  
}  

我要租房,房源都在中介手中,所以找中介--代理

复制代码
    private IRentHouse rentHouse;  

    public IntermediaryProxy(IRentHouse irentHouse){  
        rentHouse = irentHouse;  
    }  

    @Override  
    public void rentHouse() {  
        System.out.println("交中介费");  
        rentHouse.rentHouse();  
        System.out.println("中介负责维修管理");  
    }  
}  

这里中介也实现了租房的接口,中介(代理)持有真实主题(房屋出租方)的引用。**代理和被代理是有关系的,实现的是同一个接口!**来测试下。

复制代码
    public static void main(String[] args){  
        //定义租房  
        IRentHouse rentHouse = new RentHouse();  
        //定义中介  
        IRentHouse intermediary = new IntermediaryProxy(rentHouse);  
        //中介租房  
        intermediary.rentHouse();  
    }  
}  

输出:交中介费输出:租了一间房子。。。输出:中介负责维修管理这就是静态代理,因为中介这个代理类已经事先写好了,只负责代理租房业务。并且在真实主题功能上进一个扩展了功能!

静态代理的问题

静态代理的问题有没有问题呢?

当然有!刚才我们就提到中介类是事先写好的!硬编码太严重!

给大家留个小作业:这样硬编码可能会导致哪些问题呢?