Java设计模式11:常用设计模式之代理模式(结构型模式)
1. Java之代理模式(Proxy Pattern)
(1)概述:
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。
在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
2. 应用场景:
(1)简介:

• 抽象对象角色:声明真实对象和代理对象的共同接口。
• 代理对象角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能够代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
• 真实对象角色:代理角色所代表的真实对象,是我们最终要引用的对象。
2. 应用场景代码:
(1)定义一个抽象对象角色,定义公共接口buy_car,如下:
/**
*
*抽象对象角色(公共接口)
*/
public interface buy_car {
public void buy_mycar();
}
(2)定义一个真实对象角色,这个真实对象角色实现了上面的公共接口,如下:
新建一个people人类,具有买车的行为,所以实现接口buy_car
/**
*真实对象角色,它实现公共接口
*/
class people implements buy_car { private int cash;
private String vip;
private String username; @Override
public void buy_mycar() {
// TODO Auto-generated method stub
System.out.print(username+"是vip 客户,可以直接购买新车!");
} public int getCash(){
return cash;
}
public void setCash(int cash){
this.cash = cash;
}
public String getUsername(){
return username;
}
public void setUsername(String username){
this.username = username;
}
public String getVip(){
return vip;
}
public void setVip(String vip){
this.vip = vip;
}
}
(3)定义一个代理对象角色,如下:
people类不能拥有车,必须经过proxy代理类的认证,符合条件之后才可以拥有车辆,新建一个代理,这个代理类来考察当前的people是否有资格进行买车:
/**
*代理对象角色
*/
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() {
// TODO Auto-generated method stub if (people.getVip() == "vip"){
people.buy_mycar();
return ;
}
if(people.getCash()>=50000){
System.out.println(people.getUsername()+"买了新车,交易结束!");
}
else
{
System.out.println(people.getUsername()+"钱不够,不能买车,继续比赛!");
}
}
}
(4)最后一个客户端测试类,如下:
最后创建一个客户端,用来模拟买车的行为:
public class run_main { public static void main(String[] args) {
// TODO Auto-generated method stub
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(); } }
程序运行结果如下:
jeck买了新车,交易结束!
rose钱不够,不能买车,继续比赛!
tom是vip 客户,可以直接购买新车!
代理模式主要使用了java的多态,干活的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根就成,大家知根知底,你能做啥,我能做啥都清楚得很,同样一个接口。
Java设计模式11:常用设计模式之代理模式(结构型模式)的更多相关文章
- 设计模式之美:Structural Patterns(结构型模式)
结构型模式涉及到如何组合类和对象以获得更大的结构. 结构型类模式采用继承机制来组合接口实现. 结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法. 因为 ...
- 设计模式(十二): Flyweight享元模式 -- 结构型模式
说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面 ...
- 代理模式/proxy模式/结构型模式
代理模式proxy 定义 为其他对象提供一种代理,并以控制对这个对象的访问.最简单的理解,买东西都是要去商店的,不会去工厂. java实现三要素 proxy(代理)+subject(接口)+realS ...
- 设计模式(十三): Proxy代理模式 -- 结构型模式
设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路 ...
- 设计模式学习之路——Facade 外观模式(结构型模式)
动机: 组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战.如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系 ...
- 设计模式(十):Decorator装饰者模式 -- 结构型模式
1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继 ...
- 设计模式(十一):FACADE外观模式 -- 结构型模式
1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性.例子1:一个电源总开关可以控制四盏灯.一个风扇 ...
- 设计模式(七):Adapter 适配器模式 -- 结构型模式
1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化. 例子1:iphone4,你即可以 ...
- 设计模式(八):Bridge桥接模式 -- 结构型模式
1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度 ...
- 设计模式学习之适配器模式(Adapter,结构型模式)(14)
参考链接:http://www.cnblogs.com/zhili/p/AdapterPattern.html一.定义:将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼 ...
随机推荐
- [HIve - LanguageManual] Hive Operators and User-Defined Functions (UDFs)
Hive Operators and User-Defined Functions (UDFs) Hive Operators and User-Defined Functions (UDFs) Bu ...
- struts2中访问和添加Application、session以及request属性
一.访问或添加Application.session.request属性 <一>方式一 HelloWorldAction类中添加如下代码 //此方法适用于仅对Application.ses ...
- mysql统计一张表中条目个数的方法
统计一张表中条目的个通常的SQL语句是: select count(*) from tableName; #or ) from tableName; #or 统计一个列项,如ID select cou ...
- URAL-1982 Electrification Plan 最小生成树
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1982 题意:无向图,给n个点,n^2条边,每条边有个一权值,其中有k个点有发电站,给出这 ...
- 转】Maven学习总结(五)——聚合与继承
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4058008.html 感谢! 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1. ...
- JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)
JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/beans)中建立数据库连接 2)进行sql操作 3)断开数据库连接 ...
- POJ 3660 Cow Contest (最短路dijkstra)
MPI Maelstrom 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/G Description BIT has recen ...
- jpa仓库接口
可以使用的仓库接口有: Repository: 是 Spring Data的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法. CrudRepository: 继承Repos ...
- CodeForces 707C Pythagorean Triples (数论)
题意:给定一个数n,问你其他两边,能够组成直角三角形. 析:这是一个数论题. 如果 n 是奇数,那么那两边就是 (n*n-1)/2 和 (n*n+1)/2. 如果 n 是偶数,那么那两边就是 (n/2 ...
- ManagementFactory (简介)
Java Management Extensions (JMX) is a Java technology that supplies tools for managing and monitorin ...