转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39856435
代理模式(Proxy):代理模式其实就是多一个代理类出来,替原对象进行一些操作。比如咱有的时候打官司需要请律师,因为律师在法律方面有专长,可以替咱进行操作表达咱的想法,这就是代理的意思。代理模式分为两类:1、静态代理(不使用jdk里面的方法);2、动态代理(使用jdk里面的InvocationHandler和Proxy)。下面请看示例:
一、静态代理
1、uml建模:
2、代码实现
/** * 示例(一):代理模式 --静态代理(没有调用JDK里面的方法) * * 目标接口 */ interface Targetable { public void targetMethod(); } class Target implements Targetable { @Override public void targetMethod() { System.out.println("this is a target method..."); } } class Proxy implements Targetable { private Target target; public Proxy() { this.target = new Target(); } private void beforeMethod() { System.out.println("this is a method before proxy..."); } private void afterMethod() { System.out.println("this is a method after proxy..."); } /** * 在执行目标方法前后加了逻辑 */ @Override public void targetMethod() { beforeMethod(); target.targetMethod(); afterMethod(); } } /** * 客户端测试类 * * @author Leo */ public class Test { public static void main(String[] args) { /** * 创建代理对象 */ Targetable proxy = new Proxy(); /** * 执行代理方法 */ proxy.targetMethod(); } }
二、动态代理
1、uml建模:
2、代码实现
/** * 示例(二):代理模式 --动态代理 * * 以添加用户为例 */ class User { private String username; private String password; public User() { } public User(String username, String password) { this.username = username; this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [username=" + username + ", password=" + password + "]"; } } /** * 目标接口 */ interface IUserDao { public void add(User user); } class UserDaoImpl implements IUserDao { @Override public void add(User user) { System.out.println("add a user successfully..."); } } /** * 日志类 --> 待织入的Log类 */ class LogEmbed implements InvocationHandler { private IUserDao target; /** * 对target进行封装 */ public IUserDao getTarget() { return target; } public void setTarget(IUserDao target) { this.target = target; } private void beforeMethod() { System.out.println("add start..."); } private void afterMethod() { System.out.println("add end..."); } /** * 这里用到了反射 * * proxy 代理对象 * * method 目标方法 * * args 目标方法里面参数列表 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { beforeMethod(); // 回调目标对象的方法 method.invoke(target, args); System.out.println("LogEmbed --invoke-> method = " + method.getName()); afterMethod(); return null; } } /** * 客户端测试类 * * @author Leo */ public class Test { public static void main(String[] args) { IUserDao userDao = new UserDaoImpl(); LogEmbed log = new LogEmbed(); log.setTarget(userDao); /** * 根据实现的接口产生代理 */ IUserDao userDaoProxy = (IUserDao) Proxy.newProxyInstance(userDao .getClass().getClassLoader(), userDao.getClass() .getInterfaces(), log); /** * 注意:这里在调用IUserDao接口里的add方法时, * 代理对象会帮我们调用实现了InvocationHandler接口的LogEmbed类的invoke方法。 * * 这样做,是不是有点像Spring里面的拦截器呢? */ userDaoProxy.add(new User("张三", "123")); } }
三、总结
代理模式好处:1、一个代理类调用原有的方法,且对产生的结果进行控制。2、可以将功能划分的更加清晰,有助于后期维护。
相关推荐
本系统基于B/S结构模式,采用idea开发环境,建模工具Visio,以及关系型数据库MySQL。 系统采用前后端分离框架vue进行开发。前端开发负责页面的编写及数据的渲染。后端开发负责提供API(接口)。采用了MVC(Model-...
总的来说,这个毕业设计项目涵盖了社交网络分析、用户行为建模、推荐系统设计与实现等多个核心IT领域,旨在通过算法提升社交网络的信息推送效果,为用户提供更个性化的体验。通过深入研究和实践这些知识点,学生不仅...
2. **系统设计**:在需求明确后,许孟会进行系统架构设计,包括模块划分、接口定义等,这部分可能涉及到软件工程中的设计模式,比如工厂模式、单例模式等,以及UML(统一建模语言)工具的使用,如用例图、类图、序列...
这涉及到面向对象设计原则(如单一职责、开闭原则等)和设计模式(如工厂模式、观察者模式等)的应用。 3. **编程实现**:根据设计文档编写代码,这可能涉及到Java、Python、C++等编程语言,以及数据库管理(SQL)...
2. **Model-View-Controller(MVC)模式**:这是一种软件设计模式,用于分离应用程序的数据模型、用户界面和控制逻辑。在学生管理系统中,Model层负责数据处理和业务规则,View层呈现用户界面,Controller层接收用户...
7. **代码组织与设计模式**:高质量的源码会遵循一定的设计原则,如单一职责原则、开闭原则等。常见的设计模式如工厂模式、单例模式、观察者模式等可能会在代码中出现,以提高代码的可读性和可维护性。 8. **文档与...
3. **编程实现**:选择合适的编程语言(如Java、C++、Python等)和开发框架(如Spring Boot、Django、Flask等),将设计转化为代码。在此阶段,学习和应用面向对象编程、异常处理、数据结构与算法等知识至关重要。 ...
在软件开发中,设计模式是一种通用解决方案,比如单例模式、工厂模式、观察者模式等。参赛者可能会在项目中应用这些模式,提高代码可读性和可维护性。 ### 5. 软件工程原则 项目可能遵循软件工程的最佳实践,如模块...
【压缩包子文件的文件名称列表】"Graduation Design"可能包含了一系列与毕业设计相关的文件,如需求文档、设计文档、源代码文件夹、数据库脚本、测试报告、用户手册等。这些文件共同构成了项目开发的全貌,对于学习...
3. 关系建模:定义威胁元素间的关联规则,如IP地址与域名、域名与URL之间的关联。 4. 图数据库构建:使用如Neo4j这样的图数据库存储威胁情报的关联关系。 5. 可视化界面开发:设计用户友好的图形界面,显示威胁情报...
- **设计模式**:单例模式、工厂模式、装饰器模式等,用于提高代码的可读性和可维护性。 - **网络编程**:如果项目涉及网络交互,可能会用到HTTP请求、WebSocket通信等。 - **数据库操作**:如SQL查询、事务处理、...
通过结合SpringBoot框架与微信小程序的技术,实现了用户友好的交互界面和高效的数据管理。下面将详细阐述该项目的核心知识点。 一、SpringBoot框架 SpringBoot是Spring框架的扩展,它简化了Spring应用程序的初始...
- **模式**:解决常见问题的设计模式。 #### CVS - **CVS介绍**:CVS是一个版本控制系统。 - **匿名语句块**:在PL/SQL中定义的一段代码。 - **record对象**:用于存储一组相关字段的数据结构。 - **分支结构**:...
9. **数据模型er**:内置的数据建模工具可以帮助你设计复杂的实体关系模型,便于理解和改进数据库结构。 10. **作业调度**:你可以安排定期运行的任务,如备份、清理、数据加载等,实现自动化维护。 SQL Developer...
9. **编程语言与工具**:常见的BI开发工具包括Tableau、Power BI、QlikView、MicroStrategy等,而编程语言如Python、Java、SQL也是必备技能。 10. **学习资源**:学习BI系统设计,学生可参考相关教材、在线教程,...