复用形式之:委派(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. 






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值