JAVA设计模式:代理模式
最近公司从新开发一个项目,为此对老的代码进行评估分析发现有些地方是可以采用代理模式来进行的,为此对代理模式进行了一次理解:
代理模式:即为指定的目标对象提供一个代理商,由代理商来完成对目标对象的操作。
代理类图:
抽象对象角色或者接口角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方就都可以使用代理对象。
目标对象角色:定义了所需要代理对象的真实对象。
代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象通常在客户端调用目标对象之前或之后,执行某个操作,而不是单纯直接调用真实对象。
接口:
public interface Subject
{
void doSomething();
}
目标对象角色:
package com.njupt.study.designmodle.proxy; public class RealSubject implements Subject { @Override
public void doSomething()
{
System.out.println("做些什么呢?");
} }
代理对象角色:
package com.njupt.study.designmodle.proxy; public class ProxySubject implements Subject { private RealSubject realSubject; public ProxySubject()
{
if(realSubject == null)
{
realSubject = new RealSubject();
}
} @Override
public void doSomething()
{
System.out.println("befor do something");
realSubject.doSomething();
System.out.println("after do something");
} }
客户端访问:
package com.njupt.study.designmodle.proxy; public class Client { /**
* @param args
*/
public static void main(String[] args)
{
Subject subject = new ProxySubject();
subject.doSomething();
} }
输出:
总结:
代理模式的功能 : 通过创建一个代理对象,用这个代理对象去代表真实的对象,客户端使用这个代理对象来操作真实的对象(当客户端操作这个代理对象的时候,实际上功能最终还是会由真实的对象来完成,只不过是通过代理操作的,也就是客户端操作代理,代理操作真正的对象)
下面以人去买车来作为实例讲解如下:
抽象的接口:
package com.njupt.study.designmodle.proxy; /**
* 新建一个买车的接口
* @author Pony
*
*/
public interface Buy_Car
{
public void buy_mycar();
}
真实对象:
package com.njupt.study.designmodle.proxy; public class People implements Buy_Car
{ private int cash;
private String vip;
private String username; @Override
public void buy_mycar() {
System.out.print(username+"是vip 客户,可以直接购买新车!");
} public int getCash() {
return cash;
} public void setCash(int cash) {
this.cash = cash;
} public String getVip() {
return vip;
} public void setVip(String vip) {
this.vip = vip;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} }
代理对象;
package com.njupt.study.designmodle.proxy; /**
* people类不能拥有车,必须经过proxy代理类的认证,符合条件之后才可以拥有车辆,新建一个代理,这个代理类来考察当前的people是否有资格进行买车:
* @author Pony
*
*/
public class ProxyClass implements Buy_Car
{
private People people; public People getPeople() {
return people;
}
public void setPeople(People people) {
this.people = people;
} @Override
public void buy_mycar()
{
if (people.getVip() == "vip")
{
people.buy_mycar();
return;
}
if (people.getCash() >= 50000)
{
System.out.println(people.getUsername() + "买了新车,交易结束!");
} else {
System.out.println(people.getUsername() + "钱不够,不能买车,继续比赛!");
} } }
客户端:
package com.njupt.study.designmodle.proxy; public class RunClient { /**
* @param args
*/
public static void main(String[] args) {
People people_1 =new People();
people_1.setCash(60000);
people_1.setUsername("jeck"); People people_2 =new People();
people_2.setCash(40000);
people_2.setUsername("rose"); People people_3 =new People(); people_3.setCash(0);
people_3.setUsername("tom");
people_3.setVip("vip"); ProxyClass proxy_buy = new ProxyClass();
proxy_buy.setPeople(people_1);
proxy_buy.buy_mycar(); proxy_buy.setPeople(people_2);
proxy_buy.buy_mycar(); proxy_buy.setPeople(people_3);
proxy_buy.buy_mycar(); } }
运行结果如下:
JAVA设计模式:代理模式的更多相关文章
- Java设计模式-代理模式之动态代理(附源代码分析)
Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...
- JAVA 设计模式 代理模式
用途 代理模式 (Proxy) 为其他对象提供一种代理以控制对这个对象的访问. 代理模式是一种结构型模式. 结构
- Java设计模式の代理模式
目录 代理模式 1.1.静态代理 1.2.动态代理 1.3.Cglib代理 代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是 ...
- Java设计模式 - 代理模式
1.什么是代理模式: 为另一个对象提供一个替身或占位符以访问这个对象. 2.代理模式有什么好处: (1)延迟加载 当你需要从网络上面查看一张很大的图片时,你可以使用代理模式先查看它的缩略图看是否是自己 ...
- Java设计模式—代理模式
代理模式(Proxy Pattern)也叫做委托模式,是一个使用率非常高的模式. 定义如下: 为其他对象提供一种代理以控制对这个对象的访问. 个人理解: 代理模式将原类进行封装, ...
- Java设计模式——代理模式实现及原理
简介 Java编程的目标是实现现实不能完成的,优化现实能够完成的,是一种虚拟技术.生活中的方方面面都可以虚拟到代码中.代理模式所讲的就是现实生活中的这么一个概念:中介. 代理模式的定义:给某一个对象提 ...
- Java设计模式-代理模式(Proxy)
其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你 ...
- Java设计模式--代理模式+动态代理+CGLib代理
静态代理 抽象主题角色:声明真实主题和代理主题的共同接口. 代理主题角色:代理主题内部含有对真实主题的引用,从而在任何时候操作真实主题对象:代理主题提供一个与真实主题相同的接口,以便在任何时候都可以代 ...
- Java设计模式——代理模式
public interface People { public void work(); } public class RealPeople implements People { public v ...
- Java 之 设计模式——代理模式
设计模式——代理模式 一.概述 1.代理模式 (1)真实对象:被代理的对象 (2)代理对象:代理真实对象的 (3)代理模式:代理对象代理真实对象,达到增强真实对象功能的目的 二.实现方式 1.静态代理 ...
随机推荐
- IOS开发中数据持久化的几种方法--NSUserDefaults
IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefaul ...
- QGis(三)查询矢量图层的要素属性字段值(转载)
QGis(三)查询矢量图层的要素属性字段值 https://github.com/gwaldron/osgearth/issues/489 当加载一个矢量图层后,如果要查看要素的属性字段值,则需要实现 ...
- centos command中 * . 的重要性
錯誤 cp /home/test1/* /home/test2/ –a 用參數*將不可以複製linux中.開頭的隱藏文件 正確 cp /home/test1/. home ...
- iOS 之 获取View所在控制器
1. UIResponder UIViewController *uvc; UIResponder* nextResponder = [self.superview.superview.supervi ...
- 无法打开登录 'ASPState' 中请求的数据库。登录失败。
问题: 无法打开登录 'ASPState' 中请求的数据库.登录失败.用户 'WH\Administrator' 登录失败. 解决方法: (启动SQL Server Agent服务) 从本系统中找到: ...
- 仿网易邮箱5.0(四):信息提示插件(tips.js)
信息提示插件,在平常的开发中也是经常乃至的一个插件,像是一些辅助信息的提示,如:加载成功.提交信息成功或失败等等.这个插件在163邮箱中用在切换标签时提示加载状态. 下面我们先来分析一下这个小插件需要 ...
- PHP 中使用socket
一.开启socket phpinfo();查看是否开启了socket扩展,否则在php.ini中开启. 二.服务器端代码的写法 <?php error_reporting(E_ALL); set ...
- iostat中 %util高 应用延迟高
经过长时间监控,发现iostat 中的%util居高不下,一直在98%上下,说明带宽占用率极高,遇到了瓶颈. 且读写速度很慢,经过排查,发现是HBA卡出现问题,更换后,用dd if命令测试,磁盘的读写 ...
- flex blazeds地址
flex blazeds地址 BlazeDS地址:http://sourceforge.net/adobe/blazeds/wiki/Home/最新BlazeDS版本是2011年编译的4.0.1.21 ...
- WPF中将16进制颜色码转换成SolidColorBrush
使用ColorConverter.ConvertFromString(string colorValue)方法 例如:new SolidColorBrush((Color)ColorConverter ...