码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之代理模式

时间:2017-09-16 19:07:38      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:代理设计模式 proxy pattern

首先来了解一下什么是代理模式?

所谓代理模式就是对象通过代理来控制对真实对象的访问.

举个生活中的例子,我们日常购物不会直接去联系厂家购买,而是通过网上商城,线下超市等形式间接的购买.那么这些商城或者说超市就是就是我们的代理.我们的代理会去联系厂家,帮我们代购商品.

设计模式包含一下三大核心模块:

Subject (抽象主题角色):它是一个真实主题和代理主题都要实现的一个抽象接口.这样在调用真实主题的地方都可以用代理主题.

Proxy(代理主题):我们的主角,它包含了对真实主题的引用,从而可以随意的操作真实主题对象,在需要的时候创建和删除真实的对象.而且代理主题提供了和真实主题相同的接口,以便替代真实的主题.代理主题往往还会执行更多的操作,比如在调用真实主题操作之前进行安全性校验,在执行真实主题的调用后,执行日志处理等等.

RealProject(真是主题):这是一个傲娇的小公主轻易不与外界接触,一切事宜都交给管家(Proxy)来处理.

代理模式的优点和缺点:

1. 能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。

2. 客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性。

缺点:就是实现代理功能,增加了额外的工作量.

下面通过简单的案例来了解下代理模式的具体实现:

真实主题和代理主题都要实现的接口

public interface IBuy{
    void buy();
}

定义真实主题类

public class RealBuyer implements IBuy{
    @Override
    public void buy(){
        System.out.println("饿死了,我想吃蛋挞了");
    }
}

定义代理主题

public class ProxyBuyer implements IBuy{
    private RealBuy realBuy = null;
    @Override
    public void buy(){
        if(this.isEggTart()){     //是蛋挞
            realBuy = new RealBuy();
            realBuy.buy();   //买
            this.recordHistory();//收藏一下
        }
        
    }
    //检查是否是吃的
    public boolean isEggTart(){
        System.out.println("如果是蛋挞我就吃,不是我就不买!");
        return true;
    }
    //买完了记录到我的购买记录中,以便日后在来一单
    public void recordHistory(){
        System.out.println("亲,这是你最喜欢的蛋挞,要不要再来一单?");
    }
}

客户端调用:

public class Main{
    public static void main(String[] args){
        IBuy buyer = new ProxyBuyer();
        buyer.buy();
    }
}


本文出自 “数据挖掘工程师的成长历程” 博客,请务必保留此出处http://qianqiansun.blog.51cto.com/13271301/1965847

设计模式之代理模式

标签:代理设计模式 proxy pattern

原文地址:http://qianqiansun.blog.51cto.com/13271301/1965847

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!