概念: 代理模式是指通过代理,不需要去修改实现类,来完成一些额外的功能.生活中比较场景比如找房屋中介,就是很典型的例子.
本文将以"小学僧租房和买房"的例子来畅述什么是代理模式.
分类:
- 静态代理
- 动态代理
静态代理
实现类与代理类一一对应原则.
我们知道租房必须要做的事是-签合同.
//定义一个实现类和代理类共同的方法
public interface IHouse {
void contract();
}
小学僧自己需要参与签合同,我们定义一个实现类.
//实现类,真实对象
public class RealHouser implements IHouse{
@Override
public void contract() {
System.out.println("签合同");
}
}
小学僧找到中介了解房屋相关信息,中介代理办理相关事情如联系看房,收取佣金.
//定义一个代理类来代理实现类
public class ProxyHouser implements IHouse {
private IHouse iHouse;
public ProxyHouser(IHouse iHouse) {
this.iHouse = iHouse;
}
@Override
public void contract() {
before();
iHouse.contract();
after();
}
private void before() {
System.out.println("联系看房");
}
private void after() {
System.out.println("收取佣金");
}
}
最后我们看中介代理租房的结果
public class Main {
public static void main(String[] args) {
System.out.println("--------静态代理------");
RealHouser realHouser = new RealHouser();
ProxyHouser proxyHouser = new ProxyHouser(realHouser);
proxyHouser.contract();
}
}
//输出结果
--------静态代理------
联系看房
签合同
收取佣金
租了几年的房后,由于年年涨房租,小学僧决定还是去买房,这时又找到这个中介.
我们知道同一个中介既可以代理租房也可以代理买房.如果按照之前的流程我们还需要定义一个买房的代理类,显然是不科学的.我们需要动态的创建代理类,此时动态代理就派上用场了.
动态代理
运行时通过反射来动态地生成代理对象,并决定代理谁。实现InvocationHandler接口
定义一个负责创建动态代理类
public class DynamicProxyHouser implements InvocationHandler {
private Object house;//被代理类
public DynamicProxyHouser(Object house) {
this.house = house;
}
/**
* @param proxy 实现类
* @param method 实现类的某个方法
* @param args 实现类某个方法接受的参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(house, args);
after();
return result;
}
private void before() {
System.out.println("联系看房");
}
private void after() {
System.out.println("收取佣金");
}
}
最后我们看中介代理买房的结果
public class Main {
public static void main(String[] args) {
System.out.println("--------动态代理-------");
RealHouser realHouser1 = new RealHouser();
//创建一个买房的动态代理类,该代理实现了IHouse接口
/**
* 第一个参数:实现类的classLoader
* 第二个参数:代理对象需要实现的接口class
*/
IHouse iHouseProxy = (IHouse) Proxy.newProxyInstance(realHouser1.getClass().getClassLoader(),
new Class[]{IHouse.class}, new DynamicProxyHouser(realHouser1));
iHouseProxy.contract();
}
}
//输出结果
--------动态代理-------
联系看房
签合同
收取佣金
这样该中介就可以不管谁来买房或者租房,他都能代理顾客了.
由于本人技术有限,如有错误的地方,麻烦大家给我提出来,本人不胜感激,大家一起学习进步.