您的位置:首页 > 编程语言 > Java开发

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

2017-10-13 16:48 555 查看
这次来总结下代理模式(静态代理以及动态代理)的使用,以及与装饰器模式的区别:



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 d
4000
esignpatterns.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 静态代理的不足之处

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

    那么有没有办法解决这一问题?当然有,那就是动态代理啊!下次写咯
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 设计模式