(4)设计模式之代理模式

最近忙于算法和选修课的的结课考试,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("香蕉","张三");

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值