定义

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

使用场景

当不想直接访问某个对象的时候,就可以通过代理

1.不想买午餐,同事帮忙带 
2.买车不用去厂里,去4s店 
3.去代理点买火车票,不用去车站

UML

介绍下上面的UML图的意思,以购买火车票为例:

定义代理的接口,买票

()IProxy

代理的对象,完成代理的任务,设置具体的代理,调用具体的代理方法等

()ProxyObject

被代理对象,处理具体的业务逻辑

()RealObject

代码实现

上面我们已经很清晰的明白了他们之间的关系,所以接下来就用代码演示,将上面我们的想法和逻辑用代码表现出来:

(1)定义代理接口

package com.zengtao.demo.proxy;

public interface IProxy {

    void buyTicket();

}

(2)代理类

package com.zengtao.demo.proxy;

/**
* 代理
*/
public class Proxy implements IProxy { private RealProxy realClient; public Proxy(RealProxy realClient) {
this.realClient = realClient;
} @Override
public void buyTicket() {
realClient.buyTicket();
} }

(3)被代理对象买票

package com.zengtao.demo.proxy;

import com.zengtao.demo.bean.User;

/**
* 具体代理买票
*/
public class RealProxy implements IProxy { private User user; public RealProxy() { } public RealProxy(User user) {
this.user = user;
} public void setUser(User user) {
this.user = user;
} @Override
public void buyTicket() {
// 具体实现逻辑
if (user != null) {
System.out.println("***********我要买票***********");
System.out.println("信息如下:");
System.out.println("姓名:" + user.getName());
System.out.println("性别:" + user.getSex());
System.out.println("身份证号:" + user.getCardCode());
System.out.println("住址:" + user.getHomeAddress()); System.out.println("***********信息已核对***********");
System.out.println("出票成功:动车D2222次09车20A");
}
}
}

(4)用户对象

package com.zengtao.demo.bean;

import java.io.Serializable;

@SuppressWarnings("serial")
public class User implements Serializable { private String cardCode;
private String name;
private String homeAddress;
private String sex; public String getCardCode() {
return cardCode;
} public void setCardCode(String cardCode) {
this.cardCode = cardCode;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getHomeAddress() {
return homeAddress;
} public void setHomeAddress(String homeAddress) {
this.homeAddress = homeAddress;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
}
}

(6)具体调用

package com.zengtao.demo;

import com.zengtao.demo.bean.User;
import com.zengtao.demo.proxy.Proxy;
import com.zengtao.demo.proxy.RealProxy; public class Main { public static void main(String[] str) {
// 用户信息
User user = new User();
user.setCardCode("510522177709096836");
user.setSex("男");
user.setName("无名氏");
user.setHomeAddress("地球村第七号店铺"); // 具体代理
RealProxy realClient = new RealProxy();
realClient.setUser(user); // 代理
Proxy proxy = new Proxy(realClient);
proxy.buyTicket();
}
}

(7)结果

以上以代理模式的方式,简陋的实现了购票的流程。

总结

  大家也可以看到,其实代理模式,说白了就是委托,将所有的事情都委托给别人帮你完成,你所要做的,就是给代理一些东西,接下来所有的事情都是代理帮你完成,你完全不用去关心内部是如何实现的。

代理模式:一般可以分为两种,一种为静态代理,一种为动态代理

(1)静态代理

静态代理:就是我们上述所写的,代理代码是由我们自己去生成的固定的代码进行编译

(2)动态代理

动态代理:动态代理,跟静态代理相反,它是用反射机制动态的生成代理的对象,我们不需要知道谁代理谁

传送门:JAVA设计模式——代理(静态代理)

JAVA设计模式——代理(静态代理)的更多相关文章

  1. JAVA设计模式:静态代理

    一.概念代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关 ...

  2. JAVA设计模式之静态代理

    首先看看什么是代理模式. 一 代理模式 使用一个代理对象将对象包装起来,然后用该代理对象来取代该对象,任何对原始对象的调用都要通过代理,代理对象决定是否以及何时调用原始对象的方法 二 静态模式 要求被 ...

  3. 用过滤器和装饰者设计模式(静态代理)解决getParameter乱码问题

    post的乱码问题比较好解决,这里主要是对get请求的乱码做处理 解决思路:增强request对象的getParameter方法,使之 getParameter  直接获取到的就是解决乱码后的数据 有 ...

  4. Java设计模式:Proxy(代理)模式

    概念定义 代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 使用代理模式的原因有: 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象, ...

  5. java设计模式之Proxy(代理模式)

    java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...

  6. 黑马程序员:Java基础总结----静态代理模式&动态代理

    黑马程序员:Java基础总结 静态代理模式&动态代理   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public  class  Ts {   ...

  7. Java设计模式之《代理模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...

  8. Java中的静态代理实现方式

    1.编写一个接口类 如:Subject package com.neusoft.pattern.staticProxy; /** * <p>Title:</p> * <p ...

  9. 动态代理+静态代理+cglib代理 详解

    代理定义:代理(Proxy):是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 动态代理+静态 ...

  10. java中的静态代理和动态代理,入门整理

    静态代理和动态代理主要解决的问题是:在直接访问对象时带来的问题,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后 ...

随机推荐

  1. java.util.regex包下的Pattern类和Matcher类的使用总结

    一.介绍 Java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现1.Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不 ...

  2. html自适应头

     <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-sca ...

  3. 前端测试框架Jest系列教程 -- Mock Functions(模拟器)

    写在前面: 在写单元测试的时候有一个最重要的步骤就是Mock,我们通常会根据接口来Mock接口的实现,比如你要测试某个class中的某个方法,而这个方法又依赖了外部的一些接口的实现,从单元测试的角度来 ...

  4. 如何做活动页面的滚动动画?让用户体验MAX的demo在这里!

    本文由云+社区发表 最近的一个活动页面需要做一个可以左右滑动的抽签效果,故通过用css的transform属性和js结合来模拟可以无限滚动的效果. 先上效果: demo地址:https://kiror ...

  5. springboot情操陶冶-SpringApplication(二)

    承接前文springboot情操陶冶-SpringApplication(一),本文将对run()方法作下详细的解析 SpringApplication#run() main函数经常调用的run()方 ...

  6. 深入学习主成分分析(PCA)算法原理(Python实现)

    一:引入问题 首先看一个表格,下表是某些学生的语文,数学,物理,化学成绩统计: 首先,假设这些科目成绩不相关,也就是说某一科目考多少分与其他科目没有关系,那么如何判断三个学生的优秀程度呢?首先我们一眼 ...

  7. Perl文件句柄相关常量变量

    文件句柄相关变量 对应的官方手册:http://perldoc.perl.org/perlvar.html#Variables-related-to-filehandles 默认情况下: $/:输入行 ...

  8. 【golang-GUI开发】struct tags系统(二)qt的自定义组件和构造函数

    今天我们来讲讲自定义组件和它的构造函数. 在前面的文章里我们已经接触了好几个自定组件,这次的示例是一个自定义对话框,他有一个about按钮,点击按钮可以显示出Qt的信息或者用户输入的信息.这是效果图: ...

  9. NLP入门(五)用深度学习实现命名实体识别(NER)

    前言   在文章:NLP入门(四)命名实体识别(NER)中,笔者介绍了两个实现命名实体识别的工具--NLTK和Stanford NLP.在本文中,我们将会学习到如何使用深度学习工具来自己一步步地实现N ...

  10. 微信开发中网页授权access_token与基础支持的access_token异同 【转载、收藏】

    问题1:网页授权access_token与分享的jssdk中的access_token一样吗? 答:不一样.网页授权access_token 是一次性的,而基础支持的access_token的是有时间 ...