代理模式:
为其他对象提供一种代理以控制这个对象的访问
在某些情况下,一个客户不能或者不想直接引用另外一个对象,而代理对象可以在客户端和目标对象之间起到中介作用
代理模式中的角色:
抽象角色:声明抽象方法的接口
代理角色:持有真实对象的引用,和真实对象一样实现所有抽象角色声明的方法,并且在实现中代用真实角色的访问,增加其他方法可以在实现中调用,以完成的真实角色的控制
真实角色:实现抽象角色声明的所有方法
抽象类:UserManager
package com.bjpowernode.spring; public interface UserManager { public void addUser(String username, String password); public void delUser(int userId); public String findUser(int userId); public void modifyUser(int userId, String username, String password); }
真实实现类:UserMangerImpl
package com.bjpowernode.spring; public class UserManagerImpl implements UserManager{ @Override public void addUser(String username, String password) { // TODO Auto-generated method stub System.out.println("------------UserManagerImpl.addUser()------------------"); } @Override public void delUser(int userId) { // TODO Auto-generated method stub System.out.println("------------UserManagerImpl.delUser()------------------"); } @Override public String findUser(int userId) { // TODO Auto-generated method stub System.out.println("------------UserManagerImpl.findUser()------------------"); return "张三"; } @Override public void modifyUser(int userId, String username, String password) { // TODO Auto-generated method stub System.out.println("------------UserManagerImpl.modifyUser()------------------"); } }
代理类:UserManagerImplProxy
package com.bjpowernode.spring; public class UserManagerImplProxy implements UserManager { private UserManager userManager; // public UserManagerImplProxy(UserManager userManager){ // this.userManager = userManager; // } public UserManagerImplProxy(){ this.userManager = new UserManagerImpl(); } @Override public void addUser(String username, String password) { // TODO Auto-generated method stub checkSecurity(); userManager.addUser(username, password); } @Override public void delUser(int userId) { // TODO Auto-generated method stub checkSecurity(); userManager.delUser(userId); } @Override public String findUser(int userId) { // TODO Auto-generated method stub checkSecurity(); return userManager.findUser(userId); } @Override public void modifyUser(int userId, String username, String password) { // TODO Auto-generated method stub checkSecurity(); userManager.modifyUser(userId, username, password); } private void checkSecurity(){ System.out.println("-------------checkSecurity()---------------"); } }
客户端测试:Client
package com.bjpowernode.spring; public class Client { public static void main(String[] args){ // UserManager userManger = new UserManagerImplProxy(new UserManagerImpl()); UserManager userManger = new UserManagerImplProxy(); String username = "张三"; String password = "123456"; userManger.addUser(username, password); } }
问题:
如果有多个类需要代理,就需要对每个类提供一个对应的代理类,会导致大量的代理类.这个问题需要使用动态代理来实现