关于java:设计模式-结构型代理模式装饰者模式适配器模式桥接模式门面模式组合模式亨元模式
结构型模式次要总结了一些类或对象组合在一起的经典构造,这些经典的构造能够解决特定利用场景的问题。 罕用的:代理模式、桥接模式、装璜者模式、适配器模式 不罕用的:门面模式、组合模式、亨元模式 一、代理模式它在不扭转原始类(或叫被代理类)代码的状况下,通过引入代理类来给原始类附加性能。 1.1 实现形式代理类和原始类实现雷同的接口 public interface IUserController { UserVo login(String telephone, String password); UserVo register(String telephone, String password);}public class UserController implements IUserController { //...省略其余属性和办法... @Override public UserVo login(String telephone, String password) { //...省略login逻辑... //...返回UserVo数据...} @Override public UserVo register(String telephone, String password) { //...省略register逻辑... //...返回UserVo数据...}}public class UserControllerProxy implements IUserController { private MetricsCollector metricsCollector; private UserController userController; public UserControllerProxy(UserController userController) { this.userController = userController; this.metricsCollector = new MetricsCollector();} @Override public UserVo login(String telephone, String password) { long startTimestamp = System.currentTimeMillis(); // 委托 UserVo userVo = userController.login(telephone, password); long endTimeStamp = System.currentTimeMillis(); long responseTime = endTimeStamp - startTimestamp; RequestInfo requestInfo = new RequestInfo("login", responseTime, startTimestamp); metricsCollector.recordRequest(requestInfo); return userVo;} @Override public UserVo register(String telephone, String password) { long startTimestamp = System.currentTimeMillis(); UserVo userVo = userController.register(telephone, password); long endTimeStamp = System.currentTimeMillis(); long responseTime = endTimeStamp - startTimestamp; RequestInfo requestInfo = new RequestInfo("register", responseTime, startTimestamp); metricsCollector.recordRequest(requestInfo); return userVo;}}//UserControllerProxy应用举例//因为原始类和代理类实现雷同的接口,是基于接口而非实现编程//将UserController类对象替换为UserControllerProxy类对象,不须要改变太多代码IUserController userController = new UserControllerProxy(newUserController());继承的形式 public class UserControllerProxy extends UserController { private MetricsCollector metricsCollector; public UserControllerProxy() { this.metricsCollector = new MetricsCollector();} public UserVo login(String telephone, String password) { long startTimestamp = System.currentTimeMillis(); UserVo userVo = super.login(telephone, password); long endTimeStamp = System.currentTimeMillis(); long responseTime = endTimeStamp - startTimestamp; RequestInfo requestInfo = new RequestInfo("login", responseTime, startTimestamp); metricsCollector.recordRequest(requestInfo); return userVo;} public UserVo register(String telephone, String password) { long startTimestamp = System.currentTimeMillis(); UserVo userVo = super.register(telephone, password); long endTimeStamp = System.currentTimeMillis(); long responseTime = endTimeStamp - startTimestamp; RequestInfo requestInfo = new RequestInfo("register", responseTime, startTimestamp); metricsCollector.recordRequest(requestInfo); return userVo;}}//UserControllerProxy应用举例UserController userController = new UserControllerProxy();动静代理 public class MetricsCollectorProxy { private MetricsCollector metricsCollector; public MetricsCollectorProxy() { this.metricsCollector = new MetricsCollector();} public Object createProxy(Object proxiedObject) { Class<?>[] interfaces = proxiedObject.getClass().getInterfaces(); DynamicProxyHandler handler = new DynamicProxyHandler(proxiedObject); returnProxy.newProxyInstance(proxiedObject.getClass().getClassLoader(), interfaces, handler);} private class DynamicProxyHandler implements InvocationHandler { private Object proxiedObject; public DynamicProxyHandler(Object proxiedObject) { this.proxiedObject = proxiedObject; } @Override public Object invoke(Object proxy, Method method, Object[] args) throwsThrowable { long startTimestamp = System.currentTimeMillis(); Object result = method.invoke(proxiedObject, args); long endTimeStamp = System.currentTimeMillis(); long responseTime = endTimeStamp - startTimestamp; String apiName = proxiedObject.getClass().getName() + ":" +method.getName(); RequestInfo requestInfo = new RequestInfo(apiName, responseTime, startTimestamp); metricsCollector.recordRequest(requestInfo); return result; }}}//MetricsCollectorProxy应用举例MetricsCollectorProxy proxy = new MetricsCollectorProxy();IUserController userController = (IUserController) proxy.createProxy(newUserController());1.2 核心内容Subject(形象主题角色):它申明了实在主题和代理主题的独特接口,使得在任何应用实在主题的中央都能够应用代理主题,客户端通常须要针对形象主题角色进行编程。Proxy(代理主题角色):代理主题角色外部蕴含了对实在主题的援用,从而能够在任何时候操作实在主题对象。在代理主题角色中提供一个与实在主题角色雷同的接口,以便在任何时候都能够代替实在主题。代理主题角色还能够管制对实在主题的应用,负责在须要的时候创立和删除实在主题对象,并对实在主题对象的应用加以束缚。通常,在代理主题角色中,客户端在调用所援用的实在主题操作之前或之后还须要执行其余操作,而不仅仅是单纯调用实在主题对象中的操作。RealSubject(实在主题角色):它定义了代理角色所代表的实在对象,在实在主题角色中实现了实在的业务操作,客户端能够通过代理主题角色间接调用实在主题角色中定义的操作。1.3 利用场景:业务零碎的非功能性需要开发 ...