Java中的委托机制

一、引入

在这里插入图片描述
如上图所示,我们需要构造一个排序器,并改变默认排序方法。已经可以看到待排序的对象类型为Edge,成员变量有,s,t,weight。我们无法确定排序的具体标准。需要先定义一个实现类EdgeComparator来实现接口Comparator,在这个实现类中对compare方法进行重写,将排序规则改为weight的升序排列。然后在sort方法中以EdgeComparator创建一个comparator类型的对象。并委托使用排序方法。Collections.sort(edges, comparator);
该接口对实现它的每个类的对象强加了总排序。这种排序称为类的自然排序,类的 compareTo 方法称为其自然比较方法。
另一种方法:让你的ADT实现Comparable接口,然后override compareTo() 方法 与使用Comparator的区别:不需要构建新的Comparator类,比较代码放在ADT内部。如此一来就不存在委托的用法了。
如下图所示(可以比较一下二者的区别):
在这里插入图片描述
这里说一下重写的 public int compareTo(Student o){} 这个方法,它返回三种 int 类型的值: 负整数,零 ,正整数。
在这里插入图片描述
注:
Comparator 的使用有两种方式:
Collections.sort(list,Comparator);
list.sort(Comparator);
其实主要是看 Comparator 接口的实现,重写里面的 compare 方法。

二、进入正题——委托机制

委托只是当一个对象依赖另一个对象来实现其功能的某些子集时(一个实体将某些东西传递给另一个实体)
明智的委托使代码重用成为可能(委托可以被描述为一种用于在实体之间共享代码和数据的低级机制。)
就上面例子中提到的:排序器可以与任意排序顺序重用,比较器可以与需要比较整数的任意客户端代码重用
显式委托:将发送对象传递给接收对象
隐式委托:通过语言的成员查找规则
一个简单的委托的例子:
在这里插入图片描述
B类通过成员变量a作为委托链接,构建起两个类之间的委托
a.foo()是一个显式的委托(指明了委托的来源:在a的实例上调用foo)
委托实现功能的扩展:
在这里插入图片描述
需要添加一个功能将操作记录到操作台上。以list作为成员变量,实现委托链接。利用LoggingList的构造函数进行动态绑定。
在方法remove和add利用委托实现功能的扩展。

继承:通过新操作或覆盖操作扩展基类。
委托:捕获一个操作并将其发送给另一个对象。
许多设计模式结合使用继承和委托。
在这里插入图片描述
如果子类只需要复用父类中的一小部分方法,可以不需要使用继承,而是通过委派机制来实现。一个类不需要继承另一个类的全部方法,通过委托机制调用部分方法,从而避免大量无用的方法。

在这里插入图片描述
CRP(复合重用原则)
– 类应该通过它们的组合(通过包含实现所需功能的其他类的实例)而不是从基类或父类继承来实现多态行为和代码重用。
– 组合一个对象可以做什么(has_a 或 use_a)比扩展它是什么(is_a)更好。
委托可以看作是对象级别的重用机制,而继承是类级别的重用机制。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值