复用形式之:委派(delegation)
1. 委派/委托:一个对象请求另一个对象的功能
委派是复用的一种常见形式
一个简单例子:
正如一下所示:
Receiver 对象将操作委派给Delegate对象执行。
Client调用Receiver,而不使用Delegate对象
2. 利用委派可以扩展功能:
例如:我们要建立一个LoggingList,功能与list相同,但能记录其add/remove的操作。
我们可以使用委派:
3. 委派 vs. 继承
继承:extending一个基类,通过增加一个新操作或重写一个操作。
委派:采取一个操作,并将其传递给另一个类。
例如stack继承list并不合适,而应该使用委托的方式实现其push,pop等方法。
当使用继承,子类期望使用父类的方法时:
可能出现的一个问题:例如运行以下代码
public class test {public static void main(String[] args) {B b = new B();b.foo();}
}
class A { void foo() { this.bar(); }void bar() { System.out.println("A.bar"); }
}
class B extends A { public B() {}void foo() { super.foo(); }void bar() { System.out.println("B.bar"); }
}
本意为b调用a的方法,但由于b对a中方法涉及到的其他方法进行了重写,而达不到预期的效果。
其结果为:
而使用委托就能很好地避免这一问题。
如果子类只需要复用父类中的一小部分方法 ,
可以不需要使用继承,而是通过委派机制来实现。
如:
委托可以视为在对象层次上的复用,而继承可视为在类层次上的复用。
3. 委派的种类
1. Use(A use B)
2. Composition/aggregation(A owns B)
3. Association(A has B)
分别加以解释:
(1)Dependency:临时性的delegation
即上面所说的uses-a
只是一个临时关系,一个对象需要其他对象来实现自己。
如:
(2) Association: 永久性的delegation
即上面所说的has_a关系。
(3)Composition: 更强的delegation
delegate对象已经是receiver的一部分, 为is_part_of关系。若receiver不存在,相
应的delegate对象也不复存在。例如:
正如心脏和人的关系一样。
(4)Aggregation: 聚合。 delegate对象在receiver之外被创建,被当做参数传递给
receiver。
注:Composition vs. Aggregation
In composition, when the owning object is destroyed, so are the contained objects.
In aggregation, this is not necessarily true.
复用形式之:委派(delegation)相关推荐
- windows中关于委派(delegation)的理解
CATALOG 1.前言 2.什么是委派 2.1 前置知识 2.1.1 S4U2SELF 2.1.1.1 用途 2.1.1.2 细节 2.1.1.3 延伸 2.1.2 S4U2PROXY 2.1.2. ...
- Hadoop授权令牌解释(原标题 Hadoop Delegation Tokens Explained)
转载:https://blog.cloudera.com/hadoop-delegation-tokens-explained/ 很好的文章,但是要翻墙转载给国内的伙伴,有问题请联系删除 第一部分谷歌 ...
- 基于windows中委派的攻击思路(上)-约束性委派与非约束性委派
文章目录 1. 前言 2. 发现具有委派关系的用户和计算机 2.1 原理 2.2 利用工具查找 1. ADFind 1.查询非约束委派的主机: 2.查询约束委派的主机 2. ldapsearch 1. ...
- 大家一起学面向对象设计模式系列Chapter 02 软件设计的基本原则
我们为什么要使用设计模式呢?有人可能会说为了设计出"高内聚低耦合"的软件."高内聚低耦合"的软件实际上也就是本文所说的具有可维护性和可复用性的软件. 这篇文章主 ...
- 网络编程 TCP电子网络词库
电子词典: 要求: 登录注册功能,不能重复登录,重复注册.用户信息也存储在数据库中. 单词查询功能 历史记录功能,存储单词,意思,以及查询时间,存储在数据库 基于TCP,支持多客户端连接 采用数据库保 ...
- iphone内存管理
http://hi.baidu.com/spopavenvldiqyr/item/c8d620b6282c4d4abb0e122a iphone内存管理(一) BY 洋葱头 http://hi.bai ...
- 电子词典(基于TCP协议多进程通信和数据库)
项目:电子词典 项目要求: 登录注册功能,不能重复登录,重复注册.用户信息也存储在数据库中. 单词查询功能 历史记录功能,存储单词,意思,以及查询时间,存储在数据库 基于TCP,支持多客户端连接 采用 ...
- OOD知识---对OOA\OOD\OOP思想
面向对象设计(Object-Oriented Design,OOD)方法是OO方法中一个中间过渡环节.其主要作用是对OOA分析的结果作进一步的规范化整理,以便能够被OOP直接接受. ...
- STM32 USART串口DMA 接收和发送的源码详解!
硬件平台:STM32F103ZET6: 开发环境:KEIL 4: 先说说应用通讯模式,串口终端的工作方式和迪文屏差不多,终端被动接受MCU发的指令,终端会偶尔主动发送一些数据给MCU(像迪文屏的触摸信 ...
最新文章
- php和python交互-浅析PHP与Python进行数据交互
- python dict getitem_python – 拦截dict __getitem__方法调用,当它传递给另一个字典的更新方法时...
- 一文看懂Python(四)-----os.path模块篇
- 【转载】一起聊天的wz132
- java中计算平均成绩_Java计算平均成绩
- 7、【转载】python yield generator 详解
- 网站成功的三十三个法则
- 使用com.alibaba.druid.filter.config.ConfigTools进行加密和解密工具类
- mysql实验四数据库查询和视图_数据库实验四答案
- 计算机网络中网关、路由器、网桥、交换机概念详解
- 寻道,思考人生的价值(观小米十周年演讲有感)
- 新浪微博客户端开发之授权登录+获取微博列表
- 小白学 Python(2):基础数据类型(上)
- 基于Linux、QT、C++的“别踩白块儿”小游戏
- 如何查看mysql的安装路径
- 鸣人和佐助———三维数组标记踪迹,形象理解记忆
- ValueError: At least one stride in the given numpy array is negative解决方案
- <贪心算法>学习及经典实例分析
- uft自动化测试工具安装步骤_2020年十大最佳自动化测试工具
- 大牧絮叨设计模式:建造者模式