Java设计模式--代理模式

代理模式

为其他对象提供一种代理以控制对这个对象的访问。

Proxy Pattern

Provide a surrogate or placeholder for another object to control access to it.

类图

模式的结构与使用

代理方法模式的结构中包括三种角色。
+ 抽象主题(Subject):抽象主题是一个接口,该接口是对象和它的代理所共用的接口,即是RealSubject角色和Proxy角色实例所实现的接口。
+ 实际主题(RealSubject):实际主题是实现抽象主题接口的类。实际主题的实例是代理角色(Proxy)实例所要代理的对象。
+ 代理(Proxy):代理是实现抽象主题接口的类(代理和实际主题实现了相同的接口)。代理含有主题接口声明的变量,该变量用来存放RealSubject角色的实例引用,这样一来,代理的实例就可以控制对它所包含的RealSubject角色的实例访问,即可以控制对它所代理对象的访问。

简单的例子

Subject的接口类Geometry.java

package Proxy;

public interface Geometry {
    public double getArea();
}

RealSubject的实现类Triangle.java

package Proxy;

public class Triangle implements Geometry {

    double sideA, sideB, sideC, area;

    public Triangle(double sideA, double sideB, double sideC) {
        this.sideA = sideA;
        this.sideB = sideB;
        this.sideC = sideC;
    }

    @Override
    public double getArea() {
        double p = (sideA + sideB + sideC) / 2.0;
        area = Math.sqrt(p * (p - sideA) * (p - sideB) * (p - sideC));
        return area;
    }
}

Proxy的实现类TriangleProxy.java

package Proxy;

public class TriangleProxy implements Geometry {

    double sideA, sideB, sideC;
    Triangle triangle;

    public void setABC(double a, double b, double c) {
        sideA = a;
        sideB = b;
        sideC = c;
    }

    @Override
    public double getArea() {
        if (sideA + sideB > sideC && sideA + sideC > sideB
                && sideB + sideC > sideA) {
            triangle = new Triangle(sideA, sideB, sideC);
            double area = triangle.getArea();
            return area;
        } else
            return -1;
    }
}

测试类Application.java

package Proxy;

import java.util.Scanner;

public class Application {

    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        System.out.println("请输入三个数");
        double a,b,c;
        a = reader.nextDouble();
        b = reader.nextDouble();
        c = reader.nextDouble();
        TriangleProxy tp = new TriangleProxy();
        tp.setABC(a, b, c);
        System.out.println("面积是:" + tp.getArea());
    }
}

执行效果图

远程代理

先空着,有时间补

代理模式的优点

  • 使用代理模式可以让用户的代码和某个特定类的子类的代码解耦。
  • 代理方法的使用用户不必知道它所使用的对象是怎么被创建的,只需要知道该对象有哪些方法即可。

适用代理模式的情景

  • 用户需要一个类的子类的实例,但不希望与该类的子类形成耦合。
  • 用户需要一个类的子类的实例,但用户不知道该类有哪些子类可用。

下载源码请到

MyGitHub

时间: 2024-09-21 07:22:49

Java设计模式--代理模式的相关文章

Java的代理模式

前几天一个网友指出了我的文章中一些有失偏颇之处,那些文章都是我在阅读Java Core的时候做的总结,顺便加上我个人的一些理解.因为看的e文版,理解上有些地方可能还欠妥.下面谈一下对Java中代理模式(Proxy)的认识. 代理,想必大家都应该知道是什么冬冬了,一般的手机产商都有代理商,歌星们都有自己的经纪人,如此这些都可以看作是一种代理模式.下面我选择如下的一种情景来进行讲述:某董事长出差,但是此时公司有个聚会,董事长买单,但是由他的秘书去结帐.我们就权且把这个看作一个代理行为,^_^. 首先

[Head First设计模式]抢票中的设计模式——代理模式

原文:[Head First设计模式]抢票中的设计模式--代理模式  系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式--建造者模式 [Head First设计模式]饺子馆(冬至)中的设计模式--工厂模式 [Head First设计模式]一个人的平安夜--单例模式 引言 闲着没事,终于又拿起Head First设计模式 翻了翻,脑海里也一直在想抢票

学习JavaScript设计模式(代理模式)_javascript技巧

代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问 代理模式的用处(个人理解):为了保障当前对象的单一职责(相对独立性),而需要创建另一个对象来处理调用当前对象之前的一些逻辑以提高代码的效率.状态判断等. 代理模式中最常用的是虚拟代理和缓存代理 一.虚拟代理 虚拟代理是把一些开销很大的对象,延迟到真正需要它的时候才去创建执行 示例: 虚拟代理实现图片预加载 // 图片加载函数 var myImage = (function(){ var imgNode = document.crea

JAVA 静态代理模式详解及实例应用_java

JAVA 静态代理模式 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 代理模式说白了就是"真实对象"的代表,在访问对象时引入一定程度的间接性,因为这种间接性可以附加多种用途. 在这实现代码之前,先讲一个简单的生活故事,我们都知道我们周边有很多公司有房屋买卖或租赁的业务,比如链家(LianJia),但链家本身是不存在任何实际房屋资产的,他所售卖租赁的房屋均需要房屋产权所有人(HomeMaster)提供,才得以实现公司的房源需求:同时公司要的卖房租房业务均需要公司

跟屌丝大哥学习设计模式---代理模式

Java 代理模式详解 代理模式是我们比较常用的设计模式之一.其中新思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象.这些额外的操作通常需要与实际对象进行通信,代理模式一般涉及到的角色有:  抽象角色:声明真实对象和代理对象的共同接口:  代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象.同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装.  真实角

详解java动态代理模式_java

本文针对java动态代理进行知识点整理,具体内容如下 一. JAVA的动态代理(比较官方说法) 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处 理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的 对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提 供特定的服务. 按照代理的创建时期,代理类可以分为两种. 静态代理:由程序员创建或特定工

精解Java中代理模式的实现

简介摘要: 代理模式是GOF设计模式中的一种,常用于权限模块的架构设计,其根本的原理是通过将一个代理对象交给调用者,使得调用者不能直接使用相应的功能模块,所 有的调用被传递给代理对象,代理对象负责对真实模块完成调用,在调用者与被调用者之间建立了一个隔离带,我们可以使 代理模式是GOF设计模式中的一种,常用于权限模块的架构设计,其根本的原理是通过将一个代理对象交给调用者,使得调用者不能直接使用相应的功能模块,所有的调用被传递给代理对象,代理对象负责对真实模块完成调用,在调用者与被调用者[bei t

.NET设计模式-代理模式(Proxy Pattern)

代理模式(Proxy Pattern) --.NET设计模式系列之十四 Terrylee,2006年5月 摘要:在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来代替目标对象打点一切.这就是本文要说的Proxy模式.   主要内容 1.例说Proxy模式 2.Proxy模式效果及实现要点 --   概述 在软件系统中,有些对象有时候由于跨越网络或者其他的

解读设计模式----代理模式(Proxy Pattern)

一.说买电脑的那些事 我之前一直用的是台式机,可总感觉不方便,特别是携带,就拿租房子后搬家来说吧,费了不少劲.种种原因有了想换笔记本的想法.5.1假期和一个好朋友特到电脑城去逛了一圈,一进电脑城便见:"HP笔记本XX总代理.IBM笔记本专卖.XX电脑YY总代理......". 看了很多家销售店,给我印象最深的就是到处都是XX牌电脑专卖和代理商,就在同一层楼里我就见着同一牌子有6家代理销售商铺.呵呵,看来我们买电脑就直接找销售代理商就可以,没必要在找生产厂商了,厂商生产出电脑后就是要把产