本文主要代码来自
https://www.cnblogs.com/gonjan-blog/p/6685611.html
http://www.cnblogs.com/xdp-gacl/p/3971367.html
代理:访问实际的对象是通过代理对象来访问的。代理模式就是在访问对象时引入一定程度的间接性。
根据创建代理类的时间点可以分为静态代理和动态代理。
一、静态代理
class StaticProxy{
//1、创建Person接口
public interface Person{
//上交班费
void giveMoney();
}
//2、创建真实类并继承接口
public static class Student implements Person{
private String name;
public Student(){}
public Student(String name){
this.name = name;
}
public void giveMoney(){
System.out.println(name+"同学交了班费。");
}
}
//3、创建代理类对象,代理类既实现了Person接口又持有一个学生类,因此他可以代理学生类对象执行giveMoney方法
public static class StudentProxy implements Person{
//被代理的学生
Student stu;
public StudentProxy(){}
public StudentProxy(Person stu){
//只代理学生对象
if(stu.getClass()==Student.class){
this.stu = (Student) stu;
}
}
public void giveMoney(){
stu.giveMoney();
}
}
public static void main(String[] args) {
//被代理学生张三
Person zs = new Student("张三");
Person monitor = new StudentProxy(zs);
monitor.giveMoney();
}
}
二、动态代理
class DynamicProxy{
//1、创建接口
public interface Person{
String sing(String name);
String dance(String name);
}
//2、创建真实类
public static class LiuDeHua implements Person{
private String name;
public LiuDeHua(){}
public LiuDeHua(String name){
this.name = name;
}
public String sing(){
System.out.println("刘德华唱"+name+"歌!");
return "刘德华唱完了!";
}
public String dance(){
System.out.println("刘德华跳"+name+"舞!");
return "刘德华跳完了!";
}
}
//3、创建代理类
public static class LiuDeHuaProxy{
//定义LiuDeHua类
LiuDeHua ldh = new LiuDeHua();
//设计一个方法生产代理对象
public Person getProxy() {
return (Person) Proxy.newProxyInstance(
LiuDeHua.class.getClassLoader(),
ldh.getClass().getInterfaces(),
new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//通过method.getName得到调用的代理对象的方法
if(method.getName().equals("sing"){
System.out.println("我是经纪人,想唱歌先交十万元");
return invoke(ldh,args);
}
if(method.getName().equals("dance"){
System.out.println("我是经纪人,想跳舞先交二十万元");
return invoke(ldh,args);
}
return null;
}
}
);
}
}
public static void main(String[] args){
//1、定义代理对象
LiuDeHuaProxy proxy = new LiuDeHuaProxy();
//2、获得代理对象
Person person = proxy.getProxy();
//3、调用代理对象的sing方法
String sing = person.sing("冰雨");
System.out.println(sing);
//4、调用代理对象的dance方法
String dance = person.dance("江南Style");
System.out.println(dance);
}
}