代理角色: 代理真实角色的人,代理真实角色后一般会做一些附属操作,在这里就是中介。
(一)先给大家理解下什么事抽象角色,真实角色,代理角色。
1.客户租房,我们首先得找一个中介,中介对应了房东 public class Client { public static void main(String[] args) { Host host = new Host();//房东 Proxy proxy = new Proxy(host);//中介 proxy.rent(); } } 2.租房接口 public interface Rent { public void rent(); } 2.房东实现Rent接口 public class Host implements Rent{ public void rent(){ System.out.println("房屋出租"); } } 3.中介实现Rent接口 public class Proxy implements Rent{ private Host host;//中介要房东授权才能租房,所以要引用房东 public Proxy() { } public Proxy(Host host) { this.host = host; } public void setHost(Host host) { this.host = host; } //租房 public void rent(){ seeHouse(); host.rent(); fare(); } //看房 private void seeHouse(){ System.out.println("带房客看房"); } //收中介费 private void fare(){ System.out.println("收取中介费"); } } 理解了这几个名词的含义了,肯定缺不了来一波代码。 (二)在实际程序中的作用 (1)就拿在service层添加日志来举例,我们每执行一个方法都要添加日志,这样service层就添加了和增删改查操作不相关的代码(log),并且我们必须还得重复的添加log方法,这样就违背了我们上面说的不关注一些公共复杂的业务,代码 userService接口 public interface UserService { public void add(); public void update(); public void delete(); public void search(); } userService实现类 public class UserServiceImpl implements UserService { @Override public void add() { //公共的业务----日志,安全,权限,缓存,事务等等 //A.log();---分离的思想--纸质阅读器;osgi--java模块开发-spring--osgi log("add") System.out.println("增加用户"); } @Override public void update() { log("update") System.out.println("修改用户"); } @Override public void delete() { log("delete") System.out.println("删除用户"); } @Override public void search() { log("search") System.out.println("查询用户"); } public void log(String methodName){ System.out.println("执行"+methodName+"方法"); } } (2)使用静态代理之后的代码 添加静态代理 public class UserServiceProxy implements UserService{ private UserService userService; public void setUserService(UserService userService) { this.userService = userService; } @Override public void add() { log("add"); userService.add(); } @Override public void delete() { //日志,安全,缓存,事务,异常处理等 log("delete"); userService.delete(); } @Override public void search() { log("search"); userService.search(); } public void update() { log("update"); userService.update(); } public void log(String methodName){ System.out.println("执行"+methodName+"方法"); } } 修改userService实现类,这样userService实现类就只关注他需要关注的事情 public class UserServiceImpl implements UserService { @Override public void add() { //公共的业务----日志,安全,权限,缓存,事务等等 //A.log();---分离的思想--纸质阅读器;osgi--java模块开发-spring--osgi System.out.println("增加用户"); } @Override public void update() { System.out.println("修改用户"); } @Override public void delete() { System.out.println("删除用户"); } @Override public void search() { System.out.println("查询用户"); } }好处:使得真实角色要处理的业务很纯粹,不再去关注一些公共复杂的事情,租房就只租房,不用搞其他的,公共的业务由代理完
成,我们知道在dao层有很多事情是公共的,比如增,删,改都要加上事务,还有就是service层需要加日志,这种繁琐重复的事情,
假如每次增,删,改操作我们都要加事务,这样就很麻烦。加上静态代理就能使公共业务扩展变得更加集中。
缺点:增加了代理类,工作流变大了,开发效率太低了,所以就出现了动态代理。