最近忙于算法和选修课的的结课考试,web的课程设计,计组的期中考试(还要算期末的平时分…),最近比较少写博客,今天抽空写一篇代理模式,代理模式在设计模式里面算比较简单的一个模式,也算是复习一下设计模式。
代理模式
代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。
本质:客户端和真实解决之间加了一个间接层
继续举例子,假如你想去追求她(他),她却不认识你,所以不太好意思自己送礼物,但是你的朋友认识她,于是你让你的朋友代替你送,试试写出代码。
先上UML图:
只看代码就能很好的理解代理模式:
public interface Subject {//送礼物的接口
void GiveDolls();//送洋娃娃
void GiveFlowers();//送鲜花
void GiveChocolate();//送巧克力
}
public class RealSubject implements Subject{//追求者
private String girlName;
public RealSubject(String girlName){
this.girlName=girlName;
}
@Override
public void GiveDolls() {
System.out.println(girlName+" 送你洋娃娃");
}
@Override
public void GiveFlowers() {
System.out.println(girlName+" 送你鲜花");
}
@Override
public void GiveChocolate() {
System.out.println(girlName+" 送你巧克力");
}
}
public class Proxy implements Subject{//代理类
RealSubject pursuit;
public Proxy(String girlName){
pursuit=new RealSubject(girlName);
}
@Override
public void GiveDolls() {
pursuit.GiveDolls();
}
@Override
public void GiveFlowers() {
pursuit.GiveFlowers();
}
@Override
public void GiveChocolate() {
pursuit.GiveChocolate();
}
}
public class client {
public static void main(String[] args) {
Proxy proxy = new Proxy("girlName_xxx");
proxy.GiveDolls();
proxy.GiveChocolate();
proxy.GiveFlowers();
}
}
虽然代理模式较为简单,但是代理模式的应用却很广,一般来说代理模式有以下几种应用:
1、远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
2、虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。比如说当你打开一个HTML网页时,里面可能有很多文字和图片,但你还是可以很快打开它,此时所看到的是所有的文字,但图片却是一张一张地下载后才能看到。那些未打开的图片框,就是通过虚拟代理来替代了真实的图片,此时代理存储了真实图片的路径和尺寸。
3、安全代理,用来控制真实对象访问时的权限。一般用于对象应该用不用的访问权限的时候。这里需要提一下的是——Jive论坛,这里就包括了安全代理和一些其他的设计模式,我们老师说能单独做出来的找工作就不愁了…目前我还没有时间去做,等到学完设计模式去试试。
4、智能指引,是指当调用真实的对象时,代理处理另外一些事。
代理模式虽然简单,但是运用范围较广。
一个代理模式的题目,使用了安全代理。
设计一个订单系统,只能由生成订单的本人才能对订单进行操作(如对订单的产品数量、产品名称、接受订单的人的姓名),使用代理模式,控制真实对象访问时的权限。
UML图:
代码:
package Order;
public interface OrderApi {//订单接口
public String getProductName();
public void setProductName(String productName,String user);
public int getOrderNum();
public void setOrderNum(int OrderNum,String user);
public String getOrderUser();
public void setOrderuser(String OrderUser,String user);
}
package Order;
public class OrderTruth implements OrderApi{//真实的订单类
private String productName;
private int orderNum;
private String orderUser;
public OrderTruth(String productName,int orderNum,String orderUser){
this.productName=productName;
this.orderNum=orderNum;
this.orderUser=orderUser;
}
public String getProductName(){
return productName;
}
@Override
public void setProductName(String productName, String user) {
this.productName=productName;
}
public int getOrderNum(){
return orderNum;
}
@Override
public void setOrderNum(int OrderNum, String user) {
this.orderNum=orderNum;
}
public String getOrderUser(){
return orderUser;
}
@Override
public void setOrderuser(String OrderUser, String user) {
this.orderUser=orderUser;
}
}
package Order;
public class OrderProxy implements OrderApi{//订单代理类,用来控制访问权限
private OrderTruth order;
public OrderProxy(OrderTruth truth){
this.order=truth;
}
@Override
public String getProductName() {
return this.order.getProductName();
}
@Override
public void setProductName(String productName, String user) {
if(user.equals(getOrderUser()) && user!=null){
order.setProductName(productName,user);
System.out.println("修改成功!\n修改后的信息为:"+getProductName()+","+getOrderNum()+","+getOrderUser());
}else{
System.out.println(user+",您没有修改订单中订购产品的权限!");
}
}
@Override
public int getOrderNum() {
return this.order.getOrderNum();
}
@Override
public void setOrderNum(int OrderNum, String user) {
if(user.equals(getOrderUser()) && user!=null){
order.setOrderNum(OrderNum,user);
System.out.println("修改成功!\n修改后的信息为:"+getProductName()+","+getOrderNum()+","+getOrderUser());
}else{
System.out.println(user+",您没有修改订单中订购数量的权限!");
}
}
@Override
public String getOrderUser() {
return this.order.getOrderUser();
}
@Override
public void setOrderuser(String OrderUser, String user) {
if(user.equals(getOrderUser()) && user!=null){
order.setOrderuser(OrderUser,user);
System.out.println("修改成功!\n修改后的信息为:"+getProductName()+","+getOrderNum()+","+getOrderUser());
}else{
System.out.println(user+",您没有修改订单中订购人的权限!");
}
}
}
package Order;
public class Client {//客户端
public static void main(String[] args) {
OrderTruth truth = new OrderTruth("饼干",10,"张三");
OrderProxy proxy = new OrderProxy(truth);
proxy.setOrderNum(100,"赵四");
proxy.setProductName("香蕉","张三");
}
}