设计模式--代理模式
代理模式是GOF设计模式中的一种,常用于权限模块的架构设计,其根本的原理是通过将一个代理对象交给调用者,使得调用者不能直接使用相应的功能模块,所有的调用被传递给代理对象,代理对象负责对真实模块完成调用,在调用者与被调用者之间建立了一个隔离带,我们可以使用这个隔离带进行权限检查、对象的延迟加载等功能的实现。这里不对这个设计模式的具体原理多加解释,我们直接通过一个实例的编写来完成对代理模式的应用,在理解了代理模式之后,我们将继续介绍 java中提供的一种动态代理技术与其实现。
这里我们假设有一个用户管理模块,这个模块提供了添加用户、删除用户的功能。我们现在要使用代理模式来检查权限该如何实现呢?首先我们需要具有一个类叫User用来表示一个用户的信息 代码如下:
public class User { private String username; private String password; public User() { } public User(String username, String password) { this.username = username; this.password = password; } ......} public interface IUserFace { public void addUser(User user); public void removeUser(User user);} public class UserFaceImpl implements IUserFace { public void addUser(User user) { //这里处理相关的添加用户的代码任务 //比如说连接数据库,执行相关的SQL语句 System.out.println("Add User Successfully"); } public void removeUser(User user) { //这里处理相关的删除用户的代码任务 //比如说连接数据库,执行相关的SQL语句 System.out.println("Remove User Successfully"); }} public class FaceFactory { private static FaceFactory instance; private FaceFactory() { } public static Factory getInstance() { if(instance == null) { instance = new FaceFactory(); } return instance; } public IUserFace createUserFace() { return new UserFaceImpl(); }} public class App { public static void main(String args[]) { User u = new User(); IUserFace uf = FaceFactory.getInstance().createUserFace(); uf.addUser(u); }} public class UserFaceProxy implements IUserFace { private IUserFace userFace; public UserFaceProxy(IUserFace userFace) { this.userFace = userFace; } public void addUser(User user) { //在这里检查权限,如果权限不合法则抛出[pao chu]异常[yi chang][pao chu yi chang] //如果权限通过则完成下面的工作 userFace.addUser(user); } public void removeUser(User user) { //在这里检查权限,如果权限不合法则抛出[pao chu]异常[yi chang][pao chu yi chang] //如果权限通过则完成下面的工作 userFace.removeUser(user); }} public class FaceFactory { private static FaceFactory instance; private FaceFactory() { } public static Factory getInstance() { if(instance == null) { instance = new FaceFactory(); } return instance; } public IUserFace createUserFace() { IUserFace userFace = new UserFaceImpl(); IUserFace proxy = new UserFaceProxy(userFace); return proxy; }}