Java设计模式之代理模式--经纪人的工作
前言
本文主要讲述代理模式,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。
一.什么是代理模式
代理模式是23种设计模式中结构型模式的一种,它的核心是通过代理类来完成其他对象的访问,降低访问者和被访问者的耦合度,也对功能进行了增强。
二.生活中的代理模式
1.经纪人
每个艺人都拥有自己的经纪人,帮助他处理工作上的事情,例如帮艺人接活、商务谈判、宣传包装等等,如果我们想联系上哪位艺人,主要就是通过经纪人来完成,而经纪人就跟设计模式中的代理模式类似。
2.房产中介
现在很多年轻人在大城市工作都是租房住的,大家现在购买房子或者租房的话是不是通过房产中介呢,反正是通过房产中介找到房子的,而房产中介他是负责帮助房主出售或者出租房子的,通过房产中介我们就无需每个房子都需要通过联系房主来获取房源信息,大大提高了我们选房效率,而房产中介就跟设计模式中的代理模式类似。
3.婚介
现在有很多婚介公司或者各种APP来帮助大家扩展社交范围,认识更多的人,提升恋爱率和结婚率。而婚介公司或者各种交友APP就跟设计模式中的代理模式类似。
三.代理模式的实现
代理模式有两种,一种是静态代理,一种是动态代理
1.静态代理
接下来就以演员和经纪人来举例,通过静态代理来实现。先创建一个接口和被代理对象类演员类以及静态代理类经纪人类
package com.qianfeng.ran;
/*
* @author:江帅
* 接口
* 人类接口
*/
public interface Human {
void behavior();
}
/*
* @author:江帅
* 被代理对象类
* 演员类
*/
class Actor implements Human{
@Override
public void behavior() {
System.out.println("某某明星进行拍戏");
}
}
/*
* @author:江帅
* 静态代理类
* 经纪人
*/
class Broker implements Human{
private Human human;
//获取具体的明星对象
public Broker(Human human){
this.human = human;
}
@Override
public void behavior() {
System.out.println("接商演");
System.out.println("安排行程");
human.behavior();
System.out.println("后续工作进行");
}
}
然后创建一个客户端使用代理模式,完成通过经纪人联系演员让演员拍戏,并增强功能
package com.qianfeng.ran;
/*
* @author:江帅
* 客户端
*/
public class Demo {
public static void main(String[] args) {
//创建明星对象
Actor actor = new Actor();
//创建经纪人对象并传递明星对象
Broker broker = new Broker(actor);
//执行结果:
//接商演
//安排行程
//某某明星进行拍戏
//后续工作进行
broker.behavior();
}
}
2.动态代理
接下来我们以房产中介的来举例,使用动态代理来实现。先创建代理接口人类接口和被代理对象类用户类
package com.qianfeng.ran;
/*
* @author:江帅
* 接口
* 人类接口
*/
public interface Human {
void behavior();
}
/*
* @author:江帅
* 被代理对象类
* 用户
*/
public class User implements Human{
@Override
public void behavior() {
System.out.println("租房");
}
}
再创建一个动态代理类房产中介类
package com.qianfeng.ran;
/*
* @author:江帅
* 动态代理类
* 房产中介
*/
public class DynamicProxy implements InvocationHandler {
//需要被代理的对象
private Object obj;
public Object newInstance(Object obj){
this.obj = obj;
/**
* 第一个参数为被代理对象的类加载器
* 第二个参数为被代理对象的接口
* 第三个此参数为当前对象
*/
return Proxy.newProxyInstance(obj.getClass().getClassLoader()
,obj.getClass().getInterfaces(),
this);
}
/**
* 调用被代理对象的方法都会经过该方法
* @param proxy 代理对象的引用
* @param method 被调用的方法对象
* @param args 被调用方法的参数数组
* @return 原方法的返回值
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
start();
//调用被代理对象的方法
Object respBean = method.invoke(obj, args);
commit();
return respBean;
}
public void start(){
System.out.println("带客户看房子");
}
public void commit(){
System.out.println("与客户签署合同");
}
}
最后动态代理实现通过房产中介增强用户寻找房子的行为
package com.qianfeng.ran;
/*
* @author:江帅
* 客户端
*/
public class Demo {
public static void main(String[] args) {
//创建房产中介 -- 代理对象类
DynamicProxy proxy = new DynamicProxy();
//通过房产中介找房子 -- 调用代理对象的方法并传递被代理对象,实现增强
Human human = (Human) proxy.newInstance(new User());
//执行结果:
//带客户看房子
//租房
//与客户签署合同
human.behavior();
}
}
五.总结
代理模式中分为两种代理:静态代理和动态代理
静态代理的实现会导致代理类的冗余,每增加一个被代理对象就需要增加一个代理类。就像一对一的明星经纪人,每多一个明星就需要多一个经纪人。
动态代理的实现则减少了代理类的冗余,只需要一个动态代理类即可,但是会对被代理的对象每个方法都进行增强。就像房产中介,每多个客户并不需要再额外多一个中介来服务,房产中介可以一个人对多个用户,但是每个用户得到的都是同一个房产中介的服务。
下一章,将带大家学习电脑与游戏的关系(设计模式之桥接模式)