zoukankan      html  css  js  c++  java
  • java的代理(编程思想)

    代理
    第三种关系被称为代理,java并没有提供对它的直接支持。这是继承和组合之间的中庸之道,因为我们将一个对象置于所要构造的类中(就像组合),但与此同时我们在新类中暴露了该成员对象的所有方法(就像继承)。
    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() {}
    }

    /**
    * 使用继承得到太空船
    * 然而SpaceShip并非真正的SpaceShipControls类型,即便你可以告诉SpaceShip向前运动(forward())。更准确的讲,
    * SpaceShip包含SpaceShipControls,与此同时,SpaceShipControls的所有方法在SpaceShip中暴露出来了
    */
    class SpaceShip extends SpaceShipControls {
    private String name;
    public SpaceShip(String name) { this.name = name;}
    public String toString() { return name;}
    public static void main(String[] args) {
    SpaceShip protector = new SpaceShip("NSEA Protector");
    protector.forward(100);
    }
    }
    使用代理
    /**
    * 代理解决了上面的问题
    */
    class SpaceShipDelegation {
    private String name;
    private SpaceShipControls controls = new SpaceShipControls();
    public SpaceShipDelegation(String name) {
    this.name = name;
    }
    //Delegate methods
    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);
    }
    }
    使用代理时可以拥有更多的控制力,因为我们可以选择只提供在成员对象中的方法的某个子集

    有没有发现代理和装饰者模式很像,区别应该是装饰着硬性要求提供所有基方法的访问接口。

  • 相关阅读:
    cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检測(1)
    Android给定坐标计算距离
    LeetCode——Gray Code
    hdu 1203
    2015 年度新增开源软件排名TOP100
    compact处理流程分析
    ExtJs--06--Ext.WindowGroup相关方法简单使用
    android4.4的两个bug
    高阶MapReduce_1_链接多个MapReduce作业
    如何设置eclipse格式化xml代码时不自动换行
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/7237457.html
Copyright © 2011-2022 走看看