设计模式之代理模式!
大家好,欢迎来到程序视点!上一篇文章我们讲了适配器模式(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(); }
}
输出:交中介费输出:租了一间房子。。。输出:中介负责维修管理这就是静态代理,因为中介这个代理类已经事先写好了
,只负责代理租房业务。并且在真实主题功能上进一个扩展了功能!
静态代理的问题
静态代理的问题有没有问题呢?
当然有!刚才我们就提到中介类
是事先写好的!硬编码太严重!
给大家留个小作业:这样硬编码可能会导致哪些问题呢?