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.静态代理 ...
随机推荐
- 完美分割字符串,实现字符串的splict功能
class Str:Client_C { string val; string[] str = new string[100]; public void StrT1() { //1.正常情况 //2. ...
- bzoj-1834 network 网络扩容 【网络流】
这题就是复习下网络流. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i <= b; i++) #def ...
- NLPIR中文分词器的使用
一.普通java项目 (1)添加项目jar包 File -> Project Structure Libarries 添加jar包jna-4.0.0.jar (2)将Data文件夹复制到 ...
- JV的DOM操作
一.基本概念 :是文档对象模型,这种模型为树模型:文档指标签文档:对象是指文档中每个元素:模型是指抽象化的东西. :.Windows对象操作:.属性:opener:(打开当前窗口的原窗口.)dialo ...
- JDK8新特性面试
java8:http://ifeve.com/java-8-features-tutorial/ 一.Lambda表达式和函数式接口 Lambda表达式(也叫做闭包) 它允许我们将一个函数当作方法的参 ...
- Android 使用AsyncTask 下载图片的例子,学会使用AsyncTask
1.添加布局文件:activity_main.xml 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res ...
- UIStackView属性解释
Distribution 分布: Fill:填充,会根据优先级来压缩或伸长元素 Fill Equal:全都相等,并且都填充满 Fill Proportionally:按比例填充,根据元素的内容多少的比 ...
- 启动子&外显子&内含子
启动子 http://baike.baidu.com/link?url=HMqaMY4mXusH--4hMu1p6P_XUzEve9lZhFGtxScnbb8Z9HaLYJ981eWxAuZt2iAP ...
- JS基础知识:Javascript事件触发列表
Javascript是一种由Netscape的LiveScript发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言. JavaScript使我们有能 ...
- Windows Server 2008 R2防火墙入站规则
一般服务器的端口都设置了外网无法访问,iis中创建的网站外网也是访问不了的,需要创建指定端口的入站规则后方可访问. 方法/步骤 服务器管理器-->配置-->高级安全windows防 ...