设计模式——代理模式介绍及与装饰者模式的区别

这次来总结下代理模式(静态代理以及动态代理)的使用,以及与装饰器模式的区别:


1. 代理(静态代理)模式:


    1.1 简介

    通俗地讲,代理模式就是提供一个代理,代替实际对象完成某些操作,从而控制对实际对象的访问。比如在实际生活中,我们需要买车,当客户不能或者不想直接去进行交易时,那么就需要一个中介——也就是代理,去帮客户去完成买车的操作,而客户并不需要去关注具体的业务实现。


    1.2 代理模式中类的结构

    公共抽象类或者接口:是实际对象和代理对象都要实现的接口

    实际对象:被代理的实际类实现了公共接口,此对象是真正完成业务所引用的对象

    代理类:代理类实现了公共接口,并在内部有实际对象的引用,从而可以对实际对象完成一些操作。

用框图来表示上面三者的关系如下图所示:

    

    

    1.3 与装饰者模式的区别

    从上面的框图我们可以看到,代理(静态代理)模式与装饰者模式十分相似,那么区别在哪了?我认为是在使用的场景上存在区别:装饰者模式主要用在需要扩展一个对象的功能,动态地增删功能这一场景。代理模式则恰恰与此相反,代理模式的使用不是为了扩展一个对象的功能,而是“控制”对对象的访问,“隐藏”一个对象的具体功能。

 

2. 实例分析:

    仍然以“买车”这一业务为例,分析静态代理的使用。


    2.1 创建公共接口:Business

package designpatterns.proxy;

/**
 * Created by Olive on 2017/9/11.
 */
public interface Business {
    void transaction();
}

    2.2 创建被代理类,实现公共接口

package designpatterns.proxy;

/**
 * Created by Olive on 2017/9/11.
 */
public class CarBusiness implements Business{
    public void transaction() {
        System.out.println("I want to buy a car!");
    }
}

    2.3 创建代理类,实现公共接口,代理类中维护一个被代理对象的引用

package designpatterns.proxy;

/**
 * Created by Olive on 2017/9/11.
 * 静态代理,运行前手动创建代理类,所以多个类都实现代理就需要很多个代理
 * 其次代理类和被代理类都需要实现同样的接口,如果接口发生变化,修改的地
 * 方很多,耦合度太高
 */
public class CarBusinessProxyStatic implements Business{

    private Business business;

    public CarBusinessProxyStatic(){
        System.out.println("use proxy");
        // 持有需要代理的类的实例
        business = new CarBusiness();
    }

    public void transaction() {
        System.out.println("start proxy");
        business.transaction();
        System.out.println("end proxy");
    }
}

    2.4 测试下静态代理的使用——通过代理来买辆车吧!

package designpatterns.proxy;

/**
 * Created by Olive on 2017/9/11.
 * 静态代理主要是为了控制对对象的访问,隐藏一个对象的具体信息,例如:
 * 我们要买一辆车,但是这个交易并不是我们自己完成的,而是通过代理完
 * 成了交易,使用者并不需要关注代理内部如何实现。
 */
public class ProxyTest {

    public static void main(String[] args){
        Business business = new CarBusinessProxyStatic();
        business.transaction();
    }
}

    2.5 测试结果如下

use proxy
start proxy
I want to buy a car!
end proxy

    

    2.6 静态代理的不足之处

    静态代理,需要我们在运行前手动创建代理类,所以多个类都实现代理就需要很多个代理。其次代理类和被代理类都需要实现同样的接口,如果接口发生变化,不仅会影响到被代理类,还会影响代理类,这样修改的地方会很多,类之间的耦合度太高。

    那么有没有办法解决这一问题?当然有,那就是动态代理啊!下次写咯

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值