委托与继承(转载整合)

本文详细探讨了委托和继承这两种提高代码复用性的模式。委托通过一个对象调用另一个对象的功能,分为Dependency(依赖)、Association(关联)、Composition(组合)和Aggregation(聚集)四种形式。继承则通过子类扩展基类实现代码复用。文章通过多个实例展示了两者之间的区别和应用场景。
摘要由CSDN通过智能技术生成

定义
首先明确,这两种模式提出的初衷都是为了提高代码的可复用性,而在具体实现上有所不同。

委托:一个对象需要另一个对象的功能,于是捕获该对象,并发送到另一对象中进行功能调用。
继承:获得一个基类的元素和方法。
举个例子:水果需要工厂进行榨汁,而水果本身不具有榨汁的功能,将榨汁的行为写给水果也不合适,于是我们把水果交给工厂(类)中的方法进行处理,这是委托(delegation)。
水果具有下落(fall)的行为,苹果也有下落的行为,在水果(类)中写“下落”这种行为,然后在苹果(类)中通过extends获得这个方法的复用,这是继承(inheritance)。

委托的几种形式
有了上面的基础,我们在进一步探讨委托在具体实现中的几种形式,以及它们的区别。
委托可以根据委托类和被委托类的关系粗略分为三类。

Use a (两个有委托的对象间没有从属关系)
Own a (委托方的存在完全依赖于被委托方,行为也由被委托方指定)
has a(被委托方存有委托方的一个实例,可以调用对方的一部分功能)
可能有些难区分own和has的差异,own倾向于A is a part of B这种关系,has则特指 B has a A in B这种关系,现在不理解也没关系,我们来看实例。

Dependency(依赖):短期的delegation。
在这样的关系中,被委托类执行方法时通过参数的形式收到委托类的实例(副本),对其进行操作。
两个类之间存在的关系为use-a.
我们沿袭上文,使用水果和工厂的关系来说明。

public class fruit{
}//水果类
public class factory{
    public void juice(fruit a){
        println("a juiced");
    }//榨汁
}//工厂类

水果与工厂为一个简单的Dependency关系。

Association(关联):长期的delegation。
在这样的关系中,被委托类首先明确委托类的身份,并允许被委托类使用委托类的身份做其它事(一般来说,被委托类不能做而委托类能做)。
两个类之间存在的关系为has-a。
我们引入果农来说明这一关系。
public class fruit{
}//水果类
public class farmer{
    public fruit pick(){
    };//摘水果。
    public fruit trans(){
    };//运水果。
}
public class factory{
    private farmer.
    public void setFarmer(farmer toSet){
        this.farmer = toSet;
    }
    public void juice(fruit a){
        println("a juiced");
    }
    public void juice(farmer a){
        this.juice(a.trans());
    }//新的榨汁方法
}//工厂类

果农与工厂的关系为Association的简单实例,实际上,在应用中,这种合作关系的持续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值