JAVA设计模式——代理(静态代理)
定义
为其它的对象提供一种代理,以控制这个对象的访问
使用场景
当不想直接访问某个对象的时候,就可以通过代理
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设计模式:静态代理
一.概念代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关 ...
- JAVA设计模式之静态代理
首先看看什么是代理模式. 一 代理模式 使用一个代理对象将对象包装起来,然后用该代理对象来取代该对象,任何对原始对象的调用都要通过代理,代理对象决定是否以及何时调用原始对象的方法 二 静态模式 要求被 ...
- 用过滤器和装饰者设计模式(静态代理)解决getParameter乱码问题
post的乱码问题比较好解决,这里主要是对get请求的乱码做处理 解决思路:增强request对象的getParameter方法,使之 getParameter 直接获取到的就是解决乱码后的数据 有 ...
- Java设计模式:Proxy(代理)模式
概念定义 代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 使用代理模式的原因有: 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象, ...
- java设计模式之Proxy(代理模式)
java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...
- 黑马程序员:Java基础总结----静态代理模式&动态代理
黑马程序员:Java基础总结 静态代理模式&动态代理 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public class Ts { ...
- Java设计模式之《代理模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...
- Java中的静态代理实现方式
1.编写一个接口类 如:Subject package com.neusoft.pattern.staticProxy; /** * <p>Title:</p> * <p ...
- 动态代理+静态代理+cglib代理 详解
代理定义:代理(Proxy):是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 动态代理+静态 ...
- java中的静态代理和动态代理,入门整理
静态代理和动态代理主要解决的问题是:在直接访问对象时带来的问题,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后 ...
随机推荐
- Linux编程 21 shell编程(环境变量,用户变量,命令替换)
一.概述 这篇介绍shell的变量使用,跟其实语言一样,都有声明变量,使用变量,在shell中变量允许你临时地将信息存储中shell脚本中,以便和脚本的其他命令一起使用. 1.1 环境变量 在前面章节 ...
- Linux编程 14 文件权限(用户列表passwd,用户控制shadow,useradd模板与useradd命令参数介绍)
一. 概述 linux安全系统的核心是用户账户. 创建用户时会分配用户ID(UID). UID是唯一的,但在登录系统时不是用UID,而是用登录名.在讲文件权限之之前,先了解下linux是怎样处理用户账 ...
- css自适应布局之“圣杯双飞翼”
首先,这个这么扯淡又装逼的名字不知道是谁起的,大意就是说:中间的内容随着浏览器宽度的不同,进行宽度自适应操作,而两边的内容固定宽度. 来,上个代码演示一下: <style> *{ marg ...
- ②泡茶看<数据结构>,喜欢看源码-栈ADT
前言 听着天籁,我是个音乐迷.时间充实着,会过得很快.我马上也可以到傍晚的时候去乐室吹我心爱的萨克斯. 嘟嘟嘟... 我会吹一首简单的歌咯,哈哈我想到了一个神奇的比喻,待会说. 栈ADT模型(又称LI ...
- 在关闭页面时自动清除Session cookie,页面缓存
在默认情况下,session对象在关闭浏览器后并不是立刻被销毁,因此,为了考虑系统的安全性,在用户退出时,需要即刻清除session对象,防止他人盗用session对象中的信息. 清除session对 ...
- 简易远程消息交换协议SRMP
一.SRMP目标定位 经过十多年实战经验积累以及多方共同讨论,新生命团队(https://github.com/newlifex)制订了一种简单而又具有较好扩展性的RPC(Remote Procedu ...
- 使用 AcceptTcpClientAsync 进行 异步 操作
转自:https://gist.github.com/jamesmanning/2622054 using System; using System.Collections.Generic; usin ...
- MyBatis源码解析(六)——DataSource数据源模块之池型数据源
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6675674.html 1 回顾 上一文中解读了MyBatis中非池型数据源的源码,非池型也 ...
- Multi-Model多模数据库引擎设计与实现
如今,随着业务“互联网化”和“智能化”的发展以及架构 “微服务”和“云化”的发展,应用系统对数据的存储管理提出了新的标准和要求,数据的多样性成为了数据库平台面临的一大挑战,数据库领域也催生了一种新的主 ...
- 基于SpringMVC+Spring+MyBatis实现秒杀系统【客户端交互】
前言 该篇主要实现客户端和服务的交互.在第一篇概况里我已经贴出了业务场景的交互图片. 客户端交互主要放在seckill.js里来实现.页面展现基于jsp+jstl来实现. 准备工作 1.配置web.x ...