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);
    }
    }
    使用代理时可以拥有更多的控制力,因为我们可以选择只提供在成员对象中的方法的某个子集

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

  • 相关阅读:
    跟我学Makefile(七)
    C++单例模式
    乘法逆元及求法
    推荐几个jetbrains全家桶好用的插件,同时作为备忘
    win32 获取本机网卡信息(MAC地址,IP地址等)
    centos7 安装 mysql-python时 报错 EnvironmentError: mysql_config not found
    VS2013 中使用 CxImage 库时用Unicode编码时出现链接错误
    剑指offer-二叉搜索树的后序遍历序列
    剑指offer-顺时针打印矩阵
    剑指offer-二叉树的镜像
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/7237457.html
Copyright © 2011-2022 走看看