什麼是複用代碼呢?當我們在項目程式中出現大量的重複或者結構極其相似的代碼是,重複的工作會使得程式顯得冗長,不易于管理,同時也浪費大量的時間空間資源。代碼複用很好地解決了我們上面遇到的問題。除了常見的組合和繼承方法,在這篇文章中我們還會介紹代理這種方法。
1. 組合:
什麼是組合呢?簡單來說就是has-a的關系。當我們需要使用到之前某個類的方法時,我們不需要重新實作該方法,隻需要在新的類中引入原有類,然後通過對應的對象通路該方法即可。
/**
* Created by YanMing on 2017/3/4.
*/
public class Claw {
private int length;
private int weight;
public void eatUseClaw(){
System.out.println("Eating with claw");
}
}
/**
* Created by YanMing on 2017/3/4.
*/
public class Cat {
private Claw claw;
public void catEat(){
this.claw.eatUseClaw();
}
}
2. 繼承:
繼承是我們Java語言和很多的OOP語言都不可缺少的部分。在Java中,在我們建立一個新的類的時候,我們總是需要指明我們繼承自哪個基類,否則我們就是在隐式地從Java标準根累繼承自Object。下面的例子你肯定不陌生:
/**
* Created by YanMing on 2017/3/4.
*/
public class Shape {
public Shape(){
System.out.println("Shapppppppe");
}
}
/**
* Created by YanMing on 2017/3/4.
*/
public class Circle extends Shape{
private double radius;
public Circle(){
System.out.println("Cirrrcle");
}
public static void main(String args[]){
Circle c = new Circle();
}
}
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90zdaVHbXJWdGdVZxA3RkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DOwcjNwMDM1EDNwMDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
關于繼承其他的隻是都是比較基礎的,這裡不再贅述。我們主要是為了引入下面的代理方式。
3.代理:
Java并沒有直接地對代理提供支援。這是一種繼承群組合結合的方式,因為首先我們需要像組合一樣,将一個成員對象置于所要構造的類中。但是同時,我們還在這個類中暴露了該成員對象的所有方法。例如:
/**
* Created by YanMing on 2017/3/4.
*/
public class SpaceShipControls {
void up(int velocity){}
void down(int velocity){}
void left(int velocity){}
void right(int velocity){}
void forward(int velocity){}
void back(int velocity){}
void turboBoost(){}
}
/**
* Created by YanMing on 2017/3/4.
*/
public class SpaceShipDelegation {
private String name;
private SpaceShipControls controls =
new SpaceShipControls();
public SpaceShipDelegation(String name){
this.name = name;
}
public void up(int velocity)
{
controls.up(velocity);
}
public void down(int velocity)
{
controls.down(velocity);
}
public void left(int velocity)
{
controls.left(velocity);
}
public void right(int velocity)
{
controls.right(velocity);
}
public void forward(int velocity)
{
controls.forward(velocity);
}
public void back(int velocity)
{
controls.back(velocity);
}
public void turboBoost()
{
controls.turboBoost();
}
}
我們來思考SpaceShipControls和SpaceShip之間的關系是什麼?我們應該用繼承麼?SpaceShip顯然,不能“is-a”SpaceShipControls,那麼我們應該用組合麼?這裡用組合也可以。想想一下我們如果想要飛船前進怎麼辦?需要使用spaceship.controls.forward(xxx)。代理讓我們可以在接觸這個類的同時實作想要的業務邏輯。