顾名思义,代理模式就是本该由客户直接调用某一目标对象,但却由于客户不想或不能或者由于其他某些原因,没有直接调用该对象,而是通过中间对象去调用目标对象。该中间对象即为代理,它不仅起到中介的作用,还能隐去客户不能看见的内容,或者添加客户需要的额外服务。
RMI调用就是一种代理模式。远程服务器中的服务在本地有一个stub代理,该代理封装了访问远程服务的方法,客户可通过该代理来调用远程服务。
Spring AOP也是一种代理。用户在调用原服务前后,添加的@Before和@AfterReturning注解,就是解决用户需求的新服务。
https://github.com/zero4eva/design_pattern
这里实现的对登录进行代理设置,只是为了打印日志封装出来的。实际上可以使用Spring AOP对所 有request和response进行打印日志。
LoginTest.java
public class LoginTest { public static void main(String[] args) { String name = "admin"; String password = "admin"; LoginServiceProxy loginServiceproxy = new LoginServiceProxy(); boolean loginSuccess = loginServiceproxy.login(name, password); if (loginSuccess){ System.out.println("login success!"); }else{ System.out.println("login failed!"); } } }ILoginService.java
public interface ILoginService { public boolean login(String name, String password); }LoginServiceImpl.java
public class LoginServiceImpl implements ILoginService { @Override public boolean login(String name, String password) { return "admin".equals(name) && "admin".equals(password); } }LoginServiceProxy.java
public class LoginServiceProxy implements ILoginService{ LoginServiceImpl loginService; public LoginServiceProxy() { loginService = new LoginServiceImpl(); } @Override public boolean login(String name, String password) { beforeService(name, password); boolean ret = loginService.login(name, password); afterService(ret); return ret; } public void beforeService(String name, String password) { System.out.println("-----------------------------------------------------------------"); System.out.println("login info: "); System.out.println(" name: " + name + ", password: " + password); } public void afterService(boolean loginResult) { System.out.println("login result: " + loginResult); System.out.println("-----------------------------------------------------------------"); } }