您的位置:首页 > 职场人生

黑马程序员_基础复习03_代理、组合和继承

2012-12-12 12:59 405 查看
  ------- android培训java培训、期待与您交流!
----------
1、代理

代理是继承和组合之间的中庸之道,我们将一个成员对象置于所构造的类中,又在新类中暴露了该成员对象的所有方法。前者像是组合,后者像是继承。

但是,代理可以好方便的选择成员对象中方法的某个子集。

下面举例说明代理的用法:

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(){}

 

}

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();

  }

  public static void main(String[] args) {

    SpaceShipDelegation  protector

             = new SpaceShipDelegation("megnmeng");

    protector.back(123);

  }

}

代理(delegate)(代表、委托):“代理”是类型安全的并且完全面向对象的;

代理三步曲:
a.生成自定义代理类:delegate int mydelegate();
b.然后实例化代理类:mydelegate d = new mydelegate(myclass.mymethod);
c.最后通过实例对象调用方法:int ret = d(); 

2、组合和继承的区别

  组合通常是想在新类中使用现有类的功能而并非它的接口,即在新类中嵌入某个对象,让其实现所需要的功能,一般需要将现有类的对象private。

而继承使用某个现有类,并开发出一个它的特殊版本。即你在使用一个通用类,并为了某种需要而将其特殊化。

”is a“(是一个)的关系式用来描述继承的,比如汽车是一种交通工具,交通工具有某种共性,而汽车有某些特性,我用继承获得共性,并扩展特性。

”has a“(有一个)的关系是用来描述组合的。比如汽车有轮胎、门、窗户,我可以创建轮胎、门、窗户类,在汽车类中嵌入它们,来使用它们的功能,为汽车服务。

下面是组合的例子:

class Engine{

  public void start(){}

  public void stop(){}

}

class Wheel{

  public void inflate(int psi){}

}

class Window{

  public void rollup(){}

  public void rolldown(){}

}

class Door{

  public Window window = new Window();

  public void open(){}

  public void close(){}

}

public class Car {

  public Engine engine = new Engine();

  public Wheel[] wheel = new Wheel[4];

  public Door left = new Door(),

              right = new Door();

  public Car(){

    for (int i = 0; i < 4; i++) {

    wheel[i] = new Wheel();

    }

  }

  public static void main(String[] args) {

    Car car = new Car();

    car.left .window.rollup();//车的左窗户关上

    car.wheel[0].inflate(54);//第一个轮胎打气

  }

}

在选择继承和组合的一个通用的原则是:“用继承表达行为间的差异,并用字段表达状态上的变化”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: