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

java与设计模式(六)-静态代理

2018-03-18 23:05 344 查看
结构图:
1、代理结构图
2、代理介绍
3、静态代理例子实现
4、静态代理总结
一、代理结构图



二、代理介绍
Proxy代理模式是一种结构型设计模式,主要解决的直接访问对象代理的弊端和问题。

为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间,从而在设计上获得了更大的灵活性。 更通俗的说,代理解决的问题当两个类需要通信时,引入第三方代理类,将两个类的关系解耦,让我们只了解代理类即可,而且代理的出现还可以让我们完成与另一个类之间的关系的统一管理,但是切记,代理类和委托类要实现相同的接口,因为代理真正调用的还是委托类的方法。
按照代理的创建时期,代理类可以分为两种: 静态:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。动态:在程序运行时运用反射机制动态创建而成。 下面分别用静态代理与动态代理演示一个示例:添加打印日志的功能,即每个方法调用之前和调用之后写入日志

三、静态代理例子实现
1、抽象的主题接口
/**
* Copyright © 2018, Forp Co., LTD
* <p>
* All Rights Reserved.
*/

package com.gyoomi.a_designpattern.c_proxy.static_proxy;

/**
* 抽象的主题接口
*
* @author gyoomi
* @version 2018/3/18 22:41
*/
public interface Manager {
void doSomething();
}
2、真实类/**
* Copyright © 2018, Forp Co., LTD
* <p>
* All Rights Reserved.
*/

package com.gyoomi.a_designpattern.c_proxy.static_proxy;

/**
* 真实主题类
*
* @author gyoomi
* @version 2018/3/18 22:42
*/
public class Admin implements Manager{
@Override
public void doSomething() {
System.out.println("admin is doing somethings!!!");
}
}
3、代理类/**
* Copyrigh
bfa4
t © 2018, Forp Co., LTD
* <p>
* All Rights Reserved.
*/

package com.gyoomi.a_designpattern.c_proxy.static_proxy;

/**
* 代理真实类对象
*
* @author gyoomi
* @version 2018/3/18 22:44
*/
public class ProxyAdmin implements Manager{

private Admin target;

public ProxyAdmin(Admin admin){
super();
this.target = admin;
}

@Override
public void doSomething() {
System.out.println("logger starts...");
target.doSomething();
System.out.println("logger ends....");
}
}
4、测试类
/**
* Copyright © 2018, Forp Co., LTD
* <p>
* All Rights Reserved.
*/

package com.gyoomi.a_designpattern.c_proxy.static_proxy;

/**
* 功能测试类
*
* @author gyoomi
* @version 2018/3/18 22:46
*/
public class App {
public static void main(String[] args) {
ProxyAdmin proxy = new ProxyAdmin(new Admin());
proxy.doSomething();
}
}
5、结果:
logger starts...
admin is doing somethings!!!
logger ends....

四、静态代理总结
优点: 代理使客户端不需要知道实现类是什么,怎么做的,而客户端只需知道代理即可(解耦合),对于如上的客户端代码,newUserManagerImpl()可以应用工厂将它隐藏,如上只是举个例子而已。 缺点:1)代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。2)代理对象只服务于一种类型的对象,如果要服务多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模稍大时就无法胜任了。如上的代码是只为UserManager类的访问提供了代理,但是如果还要为其他类如Department类提供代理的话,就需要我们再次添加代理Department的代理类。 举例说明:代理可以对实现类进行统一的管理,如在调用具体实现类之前,需要打印日志等信息,这样我们只需要添加一个代理类,在代理类中添加打印日志的功能,然后调用实现类,这样就避免了修改具体实现类。满足我们所说的开闭原则。但是如果想让每个实现类都添加打印日志的功能的话,就需要添加多个代理类,以及代理类中各个方法都需要添加打印日志功能(如上的代理方法中删除,修改,以及查询都需要添加上打印日志的功能)即静态代理类只能为特定的接口(Service)服务。如想要为多个接口服务则需要建立很多个代理类。
引入动态代理: 根据如上的介绍,你会发现每个代理类只能为一个接口服务,这样程序开发中必然会产生许多的代理类所以我们就会想办法可以通过一个代理类完成全部的代理功能,那么我们就需要用动态代理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: