设计模式之代理模式

本文通过一个买汽车的实例,详细解析了代理模式的概念及其应用场景。介绍了代理模式的四种常见使用情景,并提供了Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[转帖]设计模式-快餐简解-【代理模式】

代理模式应用场景举例

比如在玩“极品飞车”这款游戏,如果游戏者手中的金钱达到了一定的数量就可以到车店买一部性能更高的赛车,那么这个卖车的“车店”就是一个典型的“汽车厂家”的“代理”,他为汽车厂家“提供卖车的服务”给有需求的人士。从面向对象的方面考虑,“销售汽车的代理”也是一个对象,那么这个对象也具有一定的状态,在软件项目中这个对象也具有管理财务进销存的基本功能,那么在设计时就要以面向OOP编程的思想来考虑软件的类结构,这个销售汽车的代理也是一个类了。

【代理模式解释】

类型:结构模式

对一些对象提供代理,以限制那些对象去访问其它对象。

代理模式UML图

代理模式-JAVA代码实现

新建一个买车的接口:

packagebuy_car_package;
publicinterfacebuy_car_package{
publicvoidbuy_car();
}

新建一个people人类,具有买车的行为,所以实现接口buy_car_package:

packagebuy_car_imple;

importbuy_car_package.buy_car_package;
publicclasspeopleimplementsbuy_car_package{

privateintcash;
privateStringusername;

publicintgetCash(){
returncash;
}

publicvoidsetCash(intcash){
this.cash=cash;
}

publicStringgetUsername(){
returnusername;
}

publicvoidsetUsername(Stringusername){
this.username=username;
}
publicvoidbuy_car(){
System.out.println(username
+"买了一台新车");
}
}

people类不能拥有车,必须经过proxy代理类的认证,符合条件之后才可以拥有车辆,新建一个代理,这个代理类来考察当前的people是否有资格进行买车:

packagebuy_car_imple;

importbuy_car_package.buy_car_package;

publicclassproxy_buy_car_impleimplementsbuy_car_package{

privatepeoplepeople;

publicpeoplegetPeople(){
returnpeople;
}

publicvoidsetPeople(peoplepeople){
this.people=people;
}

publicvoidbuy_car(){
if(people.getCash()>3000){
System.out.println(people.getUsername()
+""+people.getCash()
+"块 买了新车 交易结束");
}
else{
System.out.println(people.getUsername()
+"金钱不够,请继续比赛!");
}
}

}

最后创建一个客户端,用来模拟买车的行为:

packagerun_main;

importbuy_car_imple.people;
importbuy_car_imple.proxy_buy_car_imple;

publicclassrun_main{
publicstaticvoidmain(String[]args){
peoplepeople_ref1
=newpeople();
people_ref1.setCash(
4000);
people_ref1.setUsername(
"高洪岩");

peoplepeople_ref2
=newpeople();
people_ref2.setCash(
2000);
people_ref2.setUsername(
"岩洪高");

proxy_buy_car_impleproxy_buy_car_imple
=newproxy_buy_car_imple();
proxy_buy_car_imple.setPeople(people_ref1);
proxy_buy_car_imple.buy_car();

proxy_buy_car_imple.setPeople(people_ref2);
proxy_buy_car_imple.buy_car();

}
}

程序运行结果如下:

高洪岩花4000块 买了新车 交易结束
岩洪高金钱不够,请继续比赛
!

这样people就不可能自由的拥有车辆,必须经过proxy的认证之后才可以。

而代理模式在GOF四人帮的介绍中大体有4种使用情景:

(1)远程代理。典型的就是客户端与webservice使用的情况,客户端由于是针对OOP编程,而不是针对webservice中的方法进行编程,所以得在客户端模拟一下webservice的环境,用proxy来对webservice进行包装,这样就可以使用proxy代理类来远程操作webservice了。

(2)虚拟代理。比如你要开发一个大文档查看软件,大文档中有大的图片,有可能一个图片有100MB,在打开文件时不可能将所有的图片都显示出来,这样就可以使用代理模式,当需要查看图片时,用proxy来进行大图片的打开。

(3)安全代理。其实也就是本例中所举的买车的例子,金钱不够不可以买车!

(4)智能指引。比如在访问一个对象时检测其是否被锁定等情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值