2004-10-28撰写

读Globus Toolkit编程文档时,里面在实现operation provider时提到了delegation模式。
GOF的设计模式里好像没有这个模式,还好网上找到了相关的文档。翻译如下:

委托模式:(应该翻译成委托吧,如果翻译成代理容易和proxy模式混淆)
委托模式是一种技术,一个对象在外界来看好像实现了一些行为,但实际上是委托给相关的其他类来实现行为的.在不可以使用继承,而采用聚合时,必须使用这种技术.

一个简单的java例子:
这个例子中,C拥有调用A中f()和g()的插口.看起来C好像有A的功能.

class A {
   void f() { system.out.println("A: doing f()"; }
   void g() { system.out.println("A: doing g()"; }
 }
 class C {
   // delegation
   A a = new A();
   void f() { a.f(); }
   void g() { a.g(); }
   // normal attributes
   X x = new X();
   void y() { /* do stuff */ }
 }
 void main() {
   C c = new C();
   c.f();
   c.g();
 }

另一个复杂些的java例子.
使用接口+委托可以提高程序灵活性,和类型的安全性.这个例子中,C代理了A,B二者之一.C可以在A,B之间切换.由于A,B都必须通过实现接口以实现功能,这就提高了了类型安全性.作为折中,当然也需要写更多的代码.

interface I {
   void f();
   void g();
 }
 class A implements I {
   void f() { system.out.println("A: doing f()"; }
   void g() { system.out.println("A: doing g()"; }
 }
 class B implements I {
   void f() { system.out.println("B: doing f()"; }
   void g() { system.out.println("B: doing g()"; }
 }

class C implements I {
   // delegation
   I i = new A();
   void f() { i.f(); }
   void g() { i.g(); }
   // normal attributes
   void toA() { i = new A(); }
   void toB() { i = new B(); }
 }
 void main() {
   C c = new C();
   c.f();
   c.g();
 }

缺点:这个模式是典型的牺牲性能提高抽象程序的清晰程度. (或者说提高代码可读性)

delegation模式相关推荐

  1. Java中的delegation模式

    一.概述 最近在软件构造的课程中学习到了委派模式,委派的使用也是十分的广泛,是复用的常见形式.于是我便找些介绍以及例子来了解委派,以下便是我的一些理解.若有错误,感谢指正. 二.含义 委派模式(Del ...

  2. JAVA面试要点006---.net中的委托与java中的代理模式和委托

    1.1.1 定义 委托是一种引用方法的类型.一旦为委托分配了方法,委托将与该方法具有完全相同的行为.委托方法的使用可以像其他任何方法一样,具有参数和返回值,如下面的示例所示: //Code in C# ...

  3. iOS 消息的传递机制

    2019独角兽企业重金招聘Python工程师标准>>> 转载原地址:http://beyondvincent.com/blog/2013/12/14/124-communicatio ...

  4. Objective-C Runtime 运行时之五:协议与分类

    Objective-C中的分类允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以做到. Objective-C中的协议是普遍存在的 ...

  5. Java 已老,Kotlin 或将取而代之!

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! Java已经成为历史.它无法发展成现代语言,同时保证向后兼容性.但它为我们带来了最好的JVM ...

  6. Python-Matplotlib可视化(6)——自定义坐标轴让统计图清晰易懂

    Python-Matplotlib可视化(6)--自定义坐标轴让统计图清晰易懂 前言 控制刻度间距 控制刻度标签 更简单的设置方式 高级刻度标签控制 使用对数刻度 使用极坐标 系列链接 前言 在系列博 ...

  7. iPhone与iPad开发实战读书笔记

    iPhone开发一些读书笔记 手机应用分类 1.教育工具 2.生活工具 3.社交应用 4.定位工具 5.游戏 6.报纸和杂志的阅读器 7.移动办公应用 8.财经工具 9.手机购物应用 10.风景区相关 ...

  8. HIT哈工大软件构造实验lab3设计

    报告下载地址lab3报告 目录 一.对于ADT设计 1.1共性设计 1.2个性化设计 1.3代码展示 二.对于方案及设计模型的设计 2.1方案设计 2.1.1装饰器模式(方案6) 2.2.2委派模式( ...

  9. 大淘宝服务端技术干货沉淀和总结

    网络基础 TCP三次握手 三次握手过程 客户端--发送带有SYN标志的数据包--服务端 一次握手 Client进入syn_sent状态 服务端--发送带有SYN/ACK标志的数据包--客户端 二次握手 ...

最新文章

  1. R语言KMeans聚类分析确定最优聚类簇数实战:期望最大化expectation-maximization准则(确定最优聚类簇数)
  2. 易语言mysql锁表_MySQL的3种锁定机制
  3. 铁乐学python_day02-作业
  4. php5+init,PHP mysqli_stmt_init() 函数
  5. 人事管理系统整站php,卡盟整站程序源码 php版
  6. 零基础学python知乎-对于几乎是零基础的人,直接学 Python 编程合适吗?
  7. PHP 开发者该知道的 5 个 Composer 小技巧
  8. 20200202每日一句
  9. 互补滤波系数_说透互补滤波(1) - 线性互补滤波器从原理到实现
  10. 分享可用的谷歌学术(google scholar) hosts
  11. QFN封装芯片手工焊接方法
  12. Lowest, highest?
  13. 重温归一化(MinMaxScaler)和标准化(StandardScaler)
  14. js 如何获取浏览器的高度和宽度
  15. html移动端适配最优方法
  16. HSSF生成excel文件损坏
  17. 清原高中2021高考成绩查询,起航青春决胜高考—清原高中2021届高三学生举行最后一次升旗仪式 ......
  18. 十个python热门项目,你知道几个
  19. 从“挖土豆”到全场景营销,纷享销客CRM如何助力噢易云可持续增长?
  20. 南京邮电大学电工电子(数电)实验报告——周期信号的频谱分析 连续时间系统模拟

热门文章

  1. java.lang.NoClassDefFoundError:无法初始化类org.hibernate.validator.internal.engine.ConfigurationImpl
  2. 对“空间数据库”的理解
  3. verilog——74HC85四位数值比较器并扩展为16位数值比较器
  4. source 命令的用法(与 sh Filename、./Filename的区别)
  5. MPAndroidChart使用(BarChart为例)
  6. Worse is Better
  7. Android动画失效
  8. 软件测试工资直追开发,是我的错觉吗?
  9. 【转】使用cocosbuilder在cocos2d-…
  10. CentOS8 图形界面和命令行切换