java 实现一个简单的代理类

被代理的类:太空船的控制模块

package com.xm.unit07;

/**
 * 太空船的控制模块
 */
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() {
  }
}

构造太空船的一种方式是使用继承

package com.xm.unit07;

/**
 * 继承的方式
 */
public class SpaceShip extends SpaceShipControls {
  private String name;

  public SpaceShip(String name) {
    this.name = name;
  }

  public String toString() {
    return "{name = " + name + "}";
  }

  public static void main(String[] args) {
    SpaceShip protector = new SpaceShip("NSEA protector");
    protector.forward(100);
    System.out.println(protector);
  }
}

然而,SpaceShip并非真正的SpaceShipControls类型,即便你可以使SpaceShip向前运动(rorward())。更准确地江,SpaceShip包含SpaceShipControls,与此同时,SpaceShipControls的所有方法在SpaceShip中都暴露了出来。代理解决的此难题:

package com.xm.unit07;

/**
 * 代理的方式
 */
public class SpaceShipDelegation {
  private String name;
  private SpaceShipControls controls = new SpaceShipControls();

  public SpaceShipDelegation(String name) {
    this.name = name;
  }

  public void back(int velocity) {
    controls.back(velocity);
  }

  public void down(int velocity) {
    controls.down(velocity);
  }

  public void forward(int velocity) {
    controls.forward(velocity);
  }

  public void left(int velocity){
    controls.left(velocity);
  }

  public void right(int velocity) {
    controls.right(velocity);
  }

  public void turboBoost() {
    controls.turboBoost();
  }

  public void up(int velocity) {
    controls.up(velocity);
  }

  public static void main(String[] args) {

    SpaceShipDelegation protector = new SpaceShipDelegation("NSEA protector");
    protector.forward(100);
  }
}

可以看到,上面的方法是如何转递给了地城的controls对象,而且接口由此也就与使用继承得到的接口相同了。但是,我们使用代理时可以拥有更多的控制力,因为我们可以选择只提供在成员对象中的方法的某个子集。


版权声明:本文为weixin_48927623原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。