java之静态代理
代理基础
代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式,即通过代理对象访问目标对象。
这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.。
代理分为三种:静态代理、动态代理、Cglib代理
本文将要介绍的就是静态代理。
静态代理
静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类
通俗的说,当你去拜访一个著名人物时,你需要先访问他的管家或者经纪人,再通过他的管家或者经纪人去联系该著名人物。
这里我们定义一个User接口:
public interface User { public static final String gameName = "飞机大战"; public void playGame(); }
然后我们的目标对象如下(著名人物):
public class UserInfo implements User{ private int id; public String userName; private String password; public int getId(){ return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String toString(){ return "[ID: "+this.id+" name: "+this.userName+" password: "+this.password+"]"; } public String toString1(){ return "[ name: "+ this.userName+" password: "+this.password; } public UserInfo(){} public UserInfo(int id,String userName,String password){ this.password = password; this.userName = userName; this.id = id; } private UserInfo(int id,String password){ this.id = id; this.password = password; } @Override public void playGame() { System.out.println(gameName); } }
代理对象如下(管家):
public class UserInfoProxy implements User { private UserInfo target; public UserInfoProxy(UserInfo target){ this.target = target; } @Override public void playGame() { doBefore(); target.playGame(); doAfter(); } public void doBefore(){ System.out.println("before....光头强打飞机...."); } private void doAfter(){ System.out.println("after....光头强打完飞机...."); } }
测试代码:
public class APP { public static void main(String[] args){ UserInfo target = new UserInfo(); UserInfoProxy proxy = new UserInfoProxy(target); proxy.playGame(); } }
静态代理总结:1、可以做到不在修改目标对象功能的前提下,对目标功能扩展2、缺点因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多,一旦增加方法,目标和代理对象都要维护