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中的静态代理和动态代理,入门整理
静态代理和动态代理主要解决的问题是:在直接访问对象时带来的问题,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后 ...
随机推荐
- 图片base64上传时可能遇到的问题
base64上传图片时服务器接到的值可能会丢失字符串 解决方法如下:(分为单个上传和多个上传) <?php $BASE_DIR = "../"; //文件上传 $img = ...
- 古典音乐 (java基础 继承)
摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 一.前言 小朽不才,最近爱上了听古典音乐收录了,mozart ,贝多芬… ...
- 【杂谈】FilterChain相关知识整理
前言 做后台的,Filter肯定没少配置,但是知晓其原理的可能不多.在这之前我也不懂,但这并不影响业务开发,同时也有其他的知识要学,所以一直就没看.这阵子有点闲,刚好在看<How Tomcat ...
- 在.net core 中PetaPoco结合EntityFrameworkCore使用codefirst方法进行开发
在.net core开发过程中,使用最多的就是注入方法.但是在.net core使用PetaPoco时,PetaPoco还不支持进行注入方式进行处理一些问题. 今天对PetaPoco进行了一些扩展,可 ...
- Go signals 信号
Go中通过os/signals包,可以接受系统信号. package main import "fmt" import "os" import "os ...
- (2)编译安装lamp三部曲之mysql-技术流ken
简介 采用yum安装lamp简单,快捷,在工作中也得到了普遍应用.但是如果我们需要某些特定模块功能,以及制定安装位置等,就需要用到编译安装了,接下来将编译安装lamp之mysql. mysql的简介网 ...
- EF 延时加载与死锁
第一种 #region 第一种延迟加载 用到的时候就会去查询数据. //用到的时候就会去查询数据. //IQueryable<UserInfo> temp = from u in dbCo ...
- 升级ssh到OpenSSH_7.5p1
Redhat 6.5 x64升级SSH到OpenSSH_7.5p1 为了防止openssh安装失败导致不能远程登录,先部署telnet服务以防万一. rpm -qa telnet telnet-ser ...
- JQuery官方学习资料(译):选择器的运作
Getters 和 Setters JQuery的方法重载,方法设置和获取值一般使用相同名称的方法,当一个方法用来设置一个值的时候称之为Setter,当一个方法用来获取一个值的时候称之为Get ...
- 使用NetDrive将虚拟机映射到本地磁盘,使用smba映射本地磁盘(替代FileZilla)
使用NetDrive映射到本地磁盘 使用NetDrive软件来替代FileZilla,NetDrive是一个能把FTP空间虚拟成本地硬盘的软件,这样我们就不需要再使用FileZilla来来回拷贝文件了 ...