概念: 代理模式是指经过代理,不须要去修改实现类,来完成一些额外的功能.生活中比较场景好比找房屋中介,就是很典型的例子.bash
本文将以"小学僧租房和买房"的例子来畅述什么是代理模式.ide
分类:学习
实现类与代理类一一对应原则.ui
咱们知道租房必需要作的事是-签合同.this
//定义一个实现类和代理类共同的方法
public interface IHouse {
void contract();
}
复制代码
小学僧本身须要参与签合同,咱们定义一个实现类.spa
//实现类,真实对象
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("收取佣金");
}
}
复制代码
最后咱们看中介代理租房的结果code
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();
}
}
//输出结果
--------动态代理-------
联系看房
签合同
收取佣金
复制代码
这样该中介就能够无论谁来买房或者租房,他都能代理顾客了.
因为本人技术有限,若有错误的地方,麻烦你们给我提出来,本人不胜感激,你们一块儿学习进步.