关闭

JAVA静态代理与动态代理

标签: 动态代理模式
154人阅读 评论(0) 收藏 举报
分类:
代理模式:客户-->经纪人-->歌星
            |        |  |
           客户-->代理类-->委托类
  上面将生活中的角色一一对应成java的类
  歌星开演唱会的步骤:宣传-->售票-->唱歌-->收尾款
 
分类有两种
1.静态代理
现实生活中: 一个歌星可能要开好几场演唱会,导致忙不过来,所以聘请一个代理,帮组他完成唱歌以外的所有步骤,歌星本人只负责唱歌就行
 程序设计中: 定义一个接口,里面只定义开演唱会的唱歌方法,然后定义一个明星类和一个代理明星类,这两个类都实现了此接口,然后重写接口
的方法,在代理类里面重写唱歌的方法时,方法体里面直接调用歌星类的唱歌方法,,歌星类重写唱歌的时候,方法体就写具体唱
歌内容,前提是代理类里面必须持有一个歌星类的引用
例如: interface ImI{void sing();}//声明接口
//定义一个代理类相当于经纪人
class proxy implements ImI(){
Star star;
public proxy(Star star){this.star=star;}//持有委托类的引用
void show(){System.out.println("show");}
void sale(){System.out.println("saleticket");}
public void sing(){star.sing();}
void recivept(){System.out.println("recivept");}

}
//定义一个委托类相当于明星
class Star implements ImI{
public void sing(System.out.println("sing...."));
}
//定义一个测试类,相当于客户
class Test{
Star star=new Star();//构造一个委托类的对象
Proxy proxy=new Proxy(star);//构造一个代理类的对象,并将委托类的对象作为实参传入
proxy.show();
proxy.sale();
proxy.sing();
proxy.recivept();
}

2.动态代理

 : 由于静态代理里面的代理类写死了,不够灵活,不能够满足生活中的需求,

例如房屋中介,代理的肯定不止一家雇主的房子,而是根据客户需求需要哪一套房子,然后去找房子的主人,
程序设计中:
interface ImI{void sing();}//声明接口
//定义一个委托类相当于明星
class Star implements ImI{
public void sing(System.out.println("sing...."));
}
//定义一个程序处理器,并实现InvcationHandler接口
calss Handler implements InvocationHanlder{
Star target;
public Handler(Star star){
this.target=star;
}
//重写InvocationHandler的invoke方法
public Object invoke(Object proxy,Method method,object[] args){
method.invoke(target,args);
return null;
}
public Object newInstance(){
Class c=target.getClass();
return Proxy.newProxynewInstance(c.getClassLoader,c.getInterfaces()||new Class[]{ImI.class}),target);
}
}
//定义一个测试类
class Test{
public static void main(String args[]){
Star star=new Star();
Handler handler=new Handler(star);//此处可以传入任意一个委托类,并也不局限于Star 这就是动态代理的根本体现
ImI proxy=handler.newInstance();//1

Class cls=Proxy.getProxyClass(star.getClass().getClassLoader(),star.getClass*().getInterfaces());//2.生成代理类
Constructor constructor=cls.getConstructor(new Class[]{InvocationHandler.class});//3.获取代理类的构造函数
ImI proxy=(ImI)constructor.newInstance(new Object[]{handler});//4.利用构造函数构造一个代理类的对象

备注:1=2+3+4; //写了1之后就注释掉234,谢写了234就注释掉1
proxy.sing();
}
}
1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7582次
    • 积分:322
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:0篇
    • 译文:1篇
    • 评论:4条