-
[面试直通版]设计模式-2-
目录
装饰器模式
解决问题:
为什么需要装饰器模式
装饰器模式的实现方式
装饰器模式的优劣
代理模式
解决问题:
为什么需要代理模式
代理模式的实现方式
代理模式的优劣
设计模式的七大原则
开闭原则
里氏替换原则
依赖倒置原则
单一职责原则
接口隔离原则
迪米特法则
合成复用原则
-
装饰器模式
-
解决问题:
- 为什么需要装饰器模式
- 装饰器模式的实现方式
- 装饰器模式的优劣
-
为什么需要装饰器模式
- 定义:
- 指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式
- 为什么:
- 在软件开发过程中,有时想用一些现存的组件
- 这些组件可能只是完成了一些核心功能
- 但在不改变其结构的情况下,可以动态地扩展其功能
- 所有这些都可以釆用装饰器模式来实现
-
装饰器模式的实现方式
- 创建一个 Shape 接口和实现了 Shape 接口的实体类
- 然后创建一个实现了 Shape 接口的抽象装饰类 ShapeDecorator,并把 Shape 对象作为它的实例变量
- RedShapeDecorator 是实现了 ShapeDecorator 的实体类
- DecoratorPatternDemo 类使用 RedShapeDecorator 来装饰 Shape 对象
-
装饰器模式的优劣
- 优:
- 装饰器是继承的有力补充,比继承灵活
- 不改变原有对象的情况下动态的给一个对象扩展功能,即插即用
- 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
- 劣:
- 装饰器模式会增加许多子类、过度使用会增加程序的复杂性
-
代理模式
-
解决问题:
- 为什么需要代理模式
- 代理模式的实现方式
- 代理模式的优劣
-
为什么需要代理模式
- 定义:
- 由于某些原因需要给某对象提供一个代理以控制对该对象的访问
- 这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介
- 为什么:
- 一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象
- 例如,购买火车票不一定要去火车站买,可以通过12306网站或者去火车票代售点买
-
代理模式的实现方式
- 点击->Proxy-静态代理<-点击
- 点击->Proxy-动态代理<-点击
-
代理模式的优劣
- 优:
- 在客户端与目标对象之间起到一个中介作用和保护目标对象的作用
- 代理对象可以扩展目标对象的功能
- 在一定程度上降低了系统的耦合度,增加了程序的可扩展性
- 劣:
- 代理模式会造成系统设计中类的数量增加
- 增加一个代理对象会造成请求处理速度变慢
- 增加了系统的复杂度
-
设计模式的七大原则
-
开闭原则
- 当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求
- 对软件测试的影响
- 提高代码的可复用性
- 提高代码的可维护性
-
里氏替换原则
- 里氏替换原则通俗来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能
- 具体些:
- 子类可以实现父类的抽象方法,但不要覆盖父类的非抽象方法
- 子类可以实现子类特有的方法
- 子类重载父类方法时,方法的输入一定要比父类方法更宽松
- 子类实现父类方法时,方法的输出一定要比父类方法更加严格
-
依赖倒置原则
- 依赖倒置原则的原始定义为:高层模块不应该依赖低层模块,两者都应该依赖其抽象;
- 抽象不应该依赖细节,细节应该依赖抽象,要面向接口编程,不要面向实现编程
- 依赖倒置原则可以降低类之间的耦合性
- 依赖倒置原则可以提高系统的稳定性
- 依赖倒置原则可以减少并行开发引起的风险
- 依赖倒置原则可以提高代码的可读性和可维护性
-
单一职责原则
- 单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分
- 降低类的复杂度
- 提高类的可读性
- 提高系统的可维护性
- 变更引起的风险降低
-
接口隔离原则
- “接口隔离原则”的定义是:客户端不应该被迫依赖于它不使用的方法
- 提高系统的灵活性和可维护性
- 提高了系统的内聚性
- 保证系统的稳定性
- 减少项目工程中的代码冗余
-
迪米特法则
- 如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用
- 其目的是降低类之间的耦合度,提高模块的相对独立性
- 降低了类之间的耦合度,提高了模块的相对独立性
- 提高了类的可复用率和系统的扩展性
- 过度使用迪米特法则会使系统产生大量的中介类
- 增加系统的复杂性,降低模块之间的通信效率
-
合成复用原则
- 合成复用原则要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现
- 继承复用破坏了类的封装性
- 继承使得父类与子类的耦合度过高
- 组合复用维持了类的封装性,新旧类之间耦合度低
- 组合复用的灵活性高
-
相关阅读:
社区街道治安智慧监管方案,AI算法赋能城市基层精细化治理
机器学习(七)模型选择
session共享(redis实现)
非线性系统的理论和方法,神经网络的非线性
在 GeoServer 上发布 Shapefile 文件作为 WMS 数据
计算机毕业设计之java+ssm爱家房屋租赁信息管理系统
设计模式-外观模式
【Vue】npm install 命令
深入理解JVM虚拟机第六篇:内存结构与类加载子系统概述
Spring boot和Vue.js实现基于oauth2授权码模式的认证 (二)
-
原文地址:https://blog.csdn.net/weixin_59624686/article/details/127095379