有一個SpaceShip(飛船)類和一個SpaceShipControls(飛船控制)類,如果SpaceShip類想要獲得SpaceShipControls類的方法,你的第一反應是什麼?第一反應可能是用繼承。這樣當然可以,先看一眼代碼。
public class SpaceShipControls {
void fly(){};
void surrender(){};//投降
}
public class SpaceShip extends SpaceShipControls
{
public static void main(String[] args)
{
SpaceShip ss=new SpaceShip();
ss.fly();
}
}
這段代碼無比簡單,SpaceShip 類現在獲得了SpaceShipControls 的fly()方法,現在可以起飛,可是我根本就不想讓它投降啊,所以我們要有選擇的的讓他繼承(前提已經說好這是兩個普通類而沒有抽象類)。
再看代碼
public class SpaceShipDelegation {
private SpaceShipControls ssc=new SpaceShipControls();
public void fly()
{
ssc.fly();
}
}
public class SpaceShip extends SpaceShipDelegation {
public static void main(String[] args)
{
SpaceShip ss=new SpaceShip();
ss.fly();
}
}
SpaceShip 繼承的是SpaceShipDelegation ,這下子SpaceShip 既可以飛,又不能投降了,在書中有這麼一句話“我們使用代理時可以擁有更多的控制力,因爲我們可以選擇只提供在成員對象中的方法的子集”。