转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39759199
装饰者(Decorator)模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更具有弹性的替代方案。对于装饰者模式,它其实是一种包装,所以我更愿意称它为一种包装。像咱们以前经常使用的Java里面的IO流就用到了装饰者模式。比如:BufferedReaderbr = new BufferedReader(new InputStreamReader(new FileInputStream(file1)));这里file1为目标对象,而像BufferedReader、InputStreamReader就可以称之为包装类。下面举例说明:
一、UML模型图
二、代码实现
/** * 对修改关闭,对扩展开放。 * * 统一接口 */ interface Filterable { public void filter(); } /** * 目标类 */ class Filter implements Filterable { @Override public void filter() { System.out.println("目标类的核心过滤方法..."); } } /** * DecoratorForFilter1包装类与目标类实现相同的接口 --> 织入Log */ class DecoratorForFilter1 implements Filterable { private Filterable filterable; public DecoratorForFilter1(Filterable filterable) { this.filterable = filterable; } private void beforeMethod() { System.out.println("DecoratorForFilter1 --> 核心过滤方法执行前执行"); } private void afterMethod() { System.out.println("DecoratorForFilter1 --> 核心过滤方法执行后执行"); } @Override public void filter() { beforeMethod(); filterable.filter(); afterMethod(); } } /** * DecoratorForFilter2包装类与目标类实现相同的接口 --> 织入Log */ class DecoratorForFilter2 implements Filterable { private Filterable filterable; public DecoratorForFilter2(Filterable filterable) { this.filterable = filterable; } private void beforeMethod() { System.out.println("DecoratorForFilter2 --> 核心过滤方法执行前执行"); } private void afterMethod() { System.out.println("DecoratorForFilter2 --> 核心过滤方法执行后执行"); } @Override public void filter() { beforeMethod(); filterable.filter(); afterMethod(); } } /** * 客户端测试类 * * @author Leo */ public class Test { public static void main(String[] args) { /** * 目标对象 */ Filterable targetObj = new Filter(); /** * 包装对象(对目标对象进行包装) */ Filterable decorObj = new DecoratorForFilter1(new DecoratorForFilter2( targetObj)); /** * 执行包装后的业务方法 */ decorObj.filter(); } }
输出:
DecoratorForFilter1 --> 核心过滤方法执行前执行
DecoratorForFilter2 --> 核心过滤方法执行前执行
目标类的核心过滤方法...
DecoratorForFilter2 --> 核心过滤方法执行后执行
DecoratorForFilter1 --> 核心过滤方法执行后执行
三、应用场景(仅代表个人观点)
I/O、过滤器
四、小结
通过输入的Log我们可以看到:输出的过程其实是将包装类“拆包”的过程,就像包装袋一样一层一层的拆开。
设计原则:1)多用组合,少用继承。2)对扩展开放,对修改关闭。
相关推荐
本系统基于B/S结构模式,采用idea开发环境,建模工具Visio,以及关系型数据库MySQL。 系统采用前后端分离框架vue进行开发。前端开发负责页面的编写及数据的渲染。后端开发负责提供API(接口)。采用了MVC(Model-...
总的来说,这个毕业设计项目涵盖了社交网络分析、用户行为建模、推荐系统设计与实现等多个核心IT领域,旨在通过算法提升社交网络的信息推送效果,为用户提供更个性化的体验。通过深入研究和实践这些知识点,学生不仅...
这涉及到面向对象设计原则(如单一职责、开闭原则等)和设计模式(如工厂模式、观察者模式等)的应用。 3. **编程实现**:根据设计文档编写代码,这可能涉及到Java、Python、C++等编程语言,以及数据库管理(SQL)...
在软件开发中,设计模式是一种通用解决方案,比如单例模式、工厂模式、观察者模式等。参赛者可能会在项目中应用这些模式,提高代码可读性和可维护性。 ### 5. 软件工程原则 项目可能遵循软件工程的最佳实践,如模块...
2. **系统设计**:在需求明确后,许孟会进行系统架构设计,包括模块划分、接口定义等,这部分可能涉及到软件工程中的设计模式,比如工厂模式、单例模式等,以及UML(统一建模语言)工具的使用,如用例图、类图、序列...
2. **Model-View-Controller(MVC)模式**:这是一种软件设计模式,用于分离应用程序的数据模型、用户界面和控制逻辑。在学生管理系统中,Model层负责数据处理和业务规则,View层呈现用户界面,Controller层接收用户...
常见的设计模式如工厂模式、单例模式、观察者模式等可能会在代码中出现,以提高代码的可读性和可维护性。 8. **文档与注释**:良好的源码会有详细的注释,解释代码的功能、工作原理和使用方法。这有助于其他参赛者...
2. **系统架构设计**:采用三层架构(表现层、业务逻辑层、数据访问层)或其他常见架构模式。 3. **数据库设计**:包括课程、教室、教师、学生等实体的数据库表设计,以及关系建模和索引优化。 4. **前端开发**:...
- **设计模式**:单例模式、工厂模式、装饰器模式等,用于提高代码的可读性和可维护性。 - **网络编程**:如果项目涉及网络交互,可能会用到HTTP请求、WebSocket通信等。 - **数据库操作**:如SQL查询、事务处理、...
3. **编程实现**:选择合适的编程语言(如Java、C++、Python等)和开发框架(如Spring Boot、Django、Flask等),将设计转化为代码。在此阶段,学习和应用面向对象编程、异常处理、数据结构与算法等知识至关重要。 ...
3. 关系建模:定义威胁元素间的关联规则,如IP地址与域名、域名与URL之间的关联。 4. 图数据库构建:使用如Neo4j这样的图数据库存储威胁情报的关联关系。 5. 可视化界面开发:设计用户友好的图形界面,显示威胁情报...
三、数据库设计 数据库是系统存储和管理信息的核心。在疫苗预约接种系统中,可能包含用户信息、疫苗库存、预约记录、接种状态等多种数据表。需要合理设计数据库结构,确保数据的一致性和完整性。可能涉及到的关系型...
9. **数据模型er**:内置的数据建模工具可以帮助你设计复杂的实体关系模型,便于理解和改进数据库结构。 10. **作业调度**:你可以安排定期运行的任务,如备份、清理、数据加载等,实现自动化维护。 SQL Developer...
- **模式**:解决常见问题的设计模式。 #### CVS - **CVS介绍**:CVS是一个版本控制系统。 - **匿名语句块**:在PL/SQL中定义的一段代码。 - **record对象**:用于存储一组相关字段的数据结构。 - **分支结构**:...
9. **编程语言与工具**:常见的BI开发工具包括Tableau、Power BI、QlikView、MicroStrategy等,而编程语言如Python、Java、SQL也是必备技能。 10. **学习资源**:学习BI系统设计,学生可参考相关教材、在线教程,...