首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计方式之 Proxy - 代理模式

2012-09-23 
设计模式之 Proxy - 代理模式Proxy模式也叫代理模式,是由GoF提出的23种软件设计模式的一种。本文介绍设计模

设计模式之 Proxy - 代理模式
Proxy模式也叫代理模式,是由GoF提出的23种软件设计模式的一种。本文介绍设计模式中的装饰(Proxy)模式的概念,用法,以及实际应用中怎么样使用代理模式进行开发。
[出自:wikimedia.org]

Subject
被代理的类的接口。
Proxy
代理类。该代理类实现了Subject接口。
RealSubject
代理元,即被代理的目标类。它实现了Subject接口。


????}

????public void updateFile(FileTbl fileTbl) {
????????System.out.println("update file:" + fileTbl.getId());
????}

????public void saveFile(FileTbl fileTbl) {
????????System.out.println("save file:" + fileTbl.getId());
????}

????public FileTbl getFile(String fileId) {
????????return new FileTbl(fileId);
????}
????
}

/**
* Proxy
* 操作文件表的DAO代理。该DAO根据用户权限判断是否进行修改,删除文件等操作。
* 如果有足够的权限,则调用FileTblDaoImpl相关方法操作文件
*
*/
class FileTblDaoProxy implements FileTblDao {
????FileTblDao fileTblDao;
????Permission permission;
????
????public FileTblDaoProxy(Permission permission) {
????????if (fileTblDao == null) {
????????????fileTblDao = new FileTblDaoImpl();
????????}
????????
????????this.permission = permission;
????}
????
????public void deleteFile(FileTbl fileTbl) {
????????if (Permission.PERMISSION.ALL.equals(permission.getLevel())) {
????????????fileTblDao.deleteFile(fileTbl);
????????} else {
????????????System.out.println("no permission to delete file:" + fileTbl.getId());
????????}
????}

????public void updateFile(FileTbl fileTbl) {
????????
????????if (Permission.PERMISSION.ALL.equals(permission.getLevel())) {
????????????fileTblDao.updateFile(fileTbl);
????????} else {
????????????System.out.println("no permission to update file:" + fileTbl.getId());
????????}
????}

????public void saveFile(FileTbl fileTbl) {
????????if (Permission.PERMISSION.ALL.equals(permission.getLevel())) {
????????????fileTblDao.saveFile(fileTbl);
????????} else {
????????????System.out.println("no permission to save file:" + fileTbl.getId());
????????}
????}

????public FileTbl getFile(String fileId) {
????????return fileTblDao.getFile(fileId);
????}
}


//文件表类
class FileTbl {
????private String id;

????public FileTbl(String id) {
????????this.id = id;
????}
????public String getId() {
????????return id;
????}

????public void setId(String id) {
????????this.id = id;
????}
????
}

//权限控制类
class Permission {
????public static enum PERMISSION {
????????ALL,
????????SEARCH
????}
????
????private PERMISSION level;
????
????public Permission(PERMISSION level) {
????????this.level = level;
????}

????public PERMISSION getLevel() {
????????return level;
????}
}



执行Client,输出结果:
设计模式之Adapter - 适配器模式
设计方式之 Proxy - 代理模式设计模式之Bridge - 桥接模式
设计方式之 Proxy - 代理模式设计模式之Decorator - 装饰模式
与Proxy模式一样,它们具有以下相同点:
- 都是构造型的设计模式
- 都是通过新类对原有类的封装(继承或委让的方式),即通过新类访问原有的类。
但它们不同点:
- 目的或行为结果不同:
????Proxy模式在客户端访问目标对象前或后,需要进行某些特别的处理;
????Adapter模式则纯粹为了给目标类或库等作一个封装,使其适合被新的系统使用,即Adapter模式是为了给目标类统一接口;
????Bridge模式则是为了分离事务内部具有并列属性的抽象与具体行为;
????Decorator模式则是可以在运行期动态地改变一个对象方法的行为。
- 接口的方式不同:
????Proxy模式中被代理的目标对象与Proxy类使用同一个接口;
????Adapter模式是为调用原对象而准备一个新的接口;
????Bridge模式中的抽象与具体行为分别使用2个不同的接口。
????Decorator模式除了装饰(Decorator)类与被装饰的类使用同一个接口之外,装饰(Decorator)类的实现还使用委让的方式。

在实际的应用中,根据我们的目的的不同而选用不同的设计模式。

热点排行