4 结构型模式之 - 代理模式

代理模式的介绍:代理模式也称为委托模式,在开发中经常用到,是编程的好帮手,在日常生活中也比较常见。比如公司中午让同事帮忙带一份饭,比如我们请一个律师打官司,比如我们用代理服务器上网等等。代理模式真是无处不在。

代理模式的定义:为其它对象提供一种代理以控制对这个对象的访问。

代理模式的使用场景:当无法或者不想直接访问某个对象或者访问某个对象存在困难时,可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象或者代理对象需要实现相同的接口。

代理模式一般的写法(静态代理模式):

代理类和被代理类共同的一个接口:

 1 /**
 2  *
 3  * 抽象角色
 4  *
 5  * 该类的主要职责是声明真实主题与代理的共同接口方法
 6  * 该类既可以是一个抽象类也可以是一个接口
 7  *
 8  */
 9 public abstract class Subject {
10
11     public abstract void visit();
12 }

一个真实的角色,也就是被代理类:

 1 /**
 2  * 真实角色
 3  *
 4  * 该类也称为被委托类或被代理类,该类定义了代理所表示的真实对象
 5  * 由其执行具体的业务逻辑方法,而客户类则通过代理类间接地调用真实主题类中定义的方法
 6  *
 7  */
 8 public class RealSubject extends Subject{
 9     @Override
10     public void visit() {
11
12     }
13 }

实现一个代理类:

 1 /**
 2  *
 3  * 代理类
 4  * 委托对象与代理对象需要实现相同的接口
 5  * 该类也被称为委托类或者代理类,该类持有一个对真实主题的类的引用
 6  * 在其所实现的接口方法中调用真实主题类中相应的接口方法执行,以此起到代理的作用
 7  *
 8  *
 9  */
10 public class ProxySubject extends Subject{
11     Subject realSubject = null;
12
13     public ProxySubject(Subject realSubject){
14         this.realSubject = realSubject;
15     }
16
17     @Override
18     public void visit() {
19         preRequest();           //真实角色前
20         realSubject.visit();
21         postRequest();          //真实角色后
22     }
23
24
25     private void preRequest(){
26     }
27
28     private void postRequest(){
29     }
30
31 }

客户端测试类:

/**
 *
 * 客户类,即使用代理类的类型
 */
public class ProxyTest {

    public static void test(){
        //构造一个真实对象
        Subject realSubject = new RealSubject();

        //通过一个真实对象构造一个代理对象
        Subject proxy = new ProxySubject(realSubject);

        //调用代理对象的相关方法
        proxy.visit();

    }

}

上面是静态代理模式的一般实现流程,我们今天讲的都是静态代理模式。

上面的流程不够真实,我们来举一个更具体的例子,比如生活中的打官司。

小明是某一个公司的员工,老板欠了小明半年的工资,无奈之下,小明请了一个律师将老板告上了法庭

首先,需要有一个抽象的接口:

 1 /**
 2  * 诉讼接口类
 3  * 4个方法很简单,诉讼的一般流程
 4  */
 5 public interface ILawsuit {
 6     //提交申请
 7     void submit();
 8     //进行举证
 9     void burden();
10     //开始辨护
11     void defend();
12     //诉讼完成
13     void finish();
14 }

需要有一个小明:

 1 /**
 2  *  被代理者,小明
 3  */
 4 public class XiaoMin implements ILawsuit{
 5     @Override
 6     public void submit() {
 7         //老板欠小明一个月工资,小明只好申请仲裁
 8         System.out.println("老板拖欠工资,特此申请仲裁");
 9     }
10
11     @Override
12     public void burden() {
13         //小明证明充分,不怕告不赢
14         System.out.println("这是合同和过去一年的银行流水");
15     }
16
17     @Override
18     public void defend() {
19         //铁证如山,辩护也没有什么好说的
20         System.out.println("证据充分,不用再说什么了");
21     }
22
23     @Override
24     public void finish() {
25         //结果也是肯定的,必赢
26         System.out.println("诉讼成功,判决老板即日起七天内结算工资");
27     }
28 }

需要有一个代理律师来代理小明打官司

 1 /**
 2  * 代理律师
 3  */
 4 public class Lawyer implements ILawsuit{
 5     //持有一个具体的被代理者的引用
 6     private ILawsuit mLawsuit;
 7
 8     public Lawyer(ILawsuit lawsuit){
 9         mLawsuit = lawsuit;
10     }
11
12     @Override
13     public void submit() {
14         mLawsuit.submit();
15     }
16
17     @Override
18     public void burden() {
19         mLawsuit.burden();
20     }
21
22     @Override
23     public void defend() {
24         mLawsuit.defend();
25     }
26
27     @Override
28     public void finish() {
29         mLawsuit.finish();
30     }
31 }

客户端怎么用呢?下面是客户端类:

 1 /**
 2  * 客户端类
 3  */
 4 public class Client {
 5
 6     public static void main(String[] args){
 7         //构造一个小明
 8         ILawsuit xiaomin = new XiaoMin();
 9
10         //构造一个律师并将小明作为构造参数传递进去
11         ILawsuit lawyer = new Lawyer(xiaomin);
12
13         //律师提交诉讼
14         lawyer.submit();
15
16         //律师进行举证
17         lawyer.burden();
18
19         //律师代替小明进行辩护
20         lawyer.defend();
21
22         //完成诉讼
23         lawyer.finish();
24     }
25
26 }

运行结果如下:

老板拖欠工资,特此申请仲裁
这是合同和过去一年的银行流水
证据充分,不用再说什么了
诉讼成功,判决老板即日起七天内结算工资

时间: 2025-01-02 16:32:41

4 结构型模式之 - 代理模式的相关文章

结构型设计模式之代理模式

结构 意图 为其他对象提供一种代理以控制对这个对象的访问. 适用性 在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用P r o x y 模式.下面是一 些可以使用P r o x y 模式常见情况: 1) 远程代理(Remote Proxy )为一个对象在不同的地址空间提供局部代表. NEXTSTEP[Add94] 使用N X P r o x y 类实现了这一目的.Coplien[Cop92] 称这种代理为“大使” (A m b a s s a d o r ). 2 )虚代理(Virtu

结构型模式之代理模式

概述 在软件开发中,有一种设计模式可以提供与代购网站类似的功能.由于某些原因,客户端不想或不能直接访问一个对象,此时可以通过一个称之为“代理”的第三者来实现间接访问,该方案对应的设计模式被称为代理模式. 代理模式是一种应用很广泛的结构型设计模式,而且变化形式非常多,常见的代理形式包括远程代理.保护代理.虚拟代理.缓冲代理.智能引用代理等. 定义 代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问. 实现 /// <summary> /// 供应商 /// </s

结构型模式:代理模式

文章首发: 结构型模式:代理模式 七大结构型模式之七:代理模式. 简介 姓名 :代理模式 英文名 :Proxy Pattern 价值观 :为生活加点料 个人介绍 : Provide a surrogate or placeholder for another object to control access to it. 为其他对象提供一种代理以控制对这个对象的访问. (来自<设计模式之禅>) 你要的故事 咱们从事 IT 行业,随时都可能上网查东西,如果网络速度慢或者网络访问受限制,那是相当的

Java进阶篇设计模式之七 ----- 享元模式和代理模式

前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 用通俗的话来说就是进行共用.生活中也有一些例子,比如之前很火的共享单车,更早之前的图书馆,编程中经常用的String类,数据库连接池等等.当然,享元模式主要的目的是复用,如果该对象没有的话,就会进行创建. 享

装饰器模式与代理模式比较

当有这样的业务需求的时候——要为写好的代码在目标代码之前或者之后添加部分操作时,此时最笨的方法就是直接在目标代码的前后加上我们需要的功能代码,但是这样违背了java封装的特性.更好一点的方法就是使用设计模式——代理模式,然而,装饰器模式也有同类的功能,那么着两种设计模式到底有什么区别呢?下面就分别来学习一下这两种设计模式. 装饰器模式类图如下: 该类图包括几个部分:一个接口(装饰器与需要被装饰的实体类都需要实现该接口,公用方法在该接口中定义),一个实现类,一个装饰器的接口,具体实现的装饰器. 在

Java-设计模式之代理模式

1.什么是代理模式? 代理模式就是为其他对象提供一种代理,以控制对这个对象的访问.例如我们在购买火车票的时候,在有些地方有火车票的代售点,这些代售点可以帮助火车站来实行购票的功能,像这种模式就是代理模式.在Java中,代理模式启动中介的作用,可以去掉功能服务或者增加额外的服务. 2.代码模式的分类 A.远程代理:为不同地理的对象提供局域网代表对象,相似于客户端和服务器一样的模式. B.虚拟代理:根据需要将资源消耗很大的对象进行延迟,真正需要的时候进行创建.例如,在我们浏览网页的时候,有时候需要加

Java代理模式——静态代理模式

一:代理模式 代理模式的作用是:为其他对象提供一种代理以控制这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 二:代理模式设计到的角色 抽象角色:声明真是对象和代理对象的共同接口(抽象类或接口). 代理角色:代理对象角色内部含有对真是对象的引用,从而可以操作真是对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能够代替真是对象.同时,代理对象可以在执行真实对象的操作时,附加其他操作,相当于对真是对象进行封装. 真实

设计模式回顾:策略模式、代理模式、装饰者模式的区别

前言 设计模式有很多,但设计模式的目的是一致的,都是为了提升代码的可读性和可扩展性.设计模式都遵循一些基本的原则,设计模式是为了遵循这些原则而创造的工具. - 单一职责原则:就一个类而言,应该仅有一个引起它变化的原因.这一点是说,如果有一些类过于臃肿,承担了过多的职责,就应当分解他. - 开放-封闭原则:软件实体(类.模块.函数等)应该可以扩展,但是不可修改.这一点是说,拒绝硬编码,拒绝直接修改原有代码. - 依赖倒转原则:高层模块不应该以来低层模块.两个都应该以来抽象.抽象不应该依赖细节.细节

9结构型模式之代理模式

概念 Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问. 所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理. 类图角色和职责 subject(抽象主题角色): 真实主题与代理主题的共同接口. RealSubject(真实主题角色): 定义了代理角色所代表的真实对象. Proxy(代理主题角色): 含有对真实主题角色的引