设计模式总共有23种模式这仅仅是为了一个目的:解耦+解耦+解耦...(高内聚低耦合满足开闭原则)

为什么要使用Proxy?

1.授权机制 不同级别的用户对同一对象拥有不同的访问权利.

2.某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动.
代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户端需要的额外服务。

Proxy的应用?

1.每个模块访问目标对象的权限不同的情况。

在一个论坛中游客与已注册的权限是不同的,已注册用户可以发帖什么的。游客但没有基本只有浏览的权限。

2.获取网络图片的时候。

用户通过浏览器访问网页时先不加载真实的大图片,而是通过代理对象的方式进行处理,先用一个线程获取一个小图片并加载显示给用户。

然后再开一个线程来调用大图片。

3.android的应用层中调用local service 的时候。

学过binder的时候会发现有很多proxy出现。应用层中不能直接驱动binder驱动程序需要通过Proxy来获取对应的数据或发送对应的另外一个进程中。

Proxy模式结构?

Subject是一个抽象类。

Proxy是RealSbuject的代理类。

RealSbuject是真实的模块类具体处理都是由它来完成。

Client里可以通过Proxy来操作RealSbuject。

通过这种思路我们可以了解一下论坛权限相关模式。

如何使用Proxy?

访问论坛系统的用户有多种类型:注册普通用户 论坛管理者 系统管理者 游客,注册普通用户才能发言;论坛管理者可以管理他被授权的论坛;

系统管理者可以管理所有事务等,这些权限划分和管理是使用Proxy完成的.

Forum是Jive的核心接口,在Forum中陈列了有关论坛操作的主要行为,如论坛名称 论坛描述的获取和修改,帖子发表删除编辑等.

在ForumPermissions中定义了各种级别权限的用户:

public class ForumPermissions implements Cacheable { 

/**
* Permission to read object.
*/
public static final int READ = 0; /**
* Permission to administer the entire sytem.
*/
public static final int SYSTEM_ADMIN = 1; /**
* Permission to administer a particular forum.
*/
public static final int FORUM_ADMIN = 2; /**
* Permission to administer a particular user.
*/
public static final int USER_ADMIN = 3; /**
* Permission to administer a particular group.
*/
public static final int GROUP_ADMIN = 4; /**
* Permission to moderate threads.
*/
public static final int MODERATE_THREADS = 5; /**
* Permission to create a new thread.
*/
public static final int CREATE_THREAD = 6; /**
* Permission to create a new message.
*/
public static final int CREATE_MESSAGE = 7; /**
* Permission to moderate messages.
*/
public static final int MODERATE_MESSAGES = 8; ..... public boolean isSystemOrForumAdmin() {
  return (values[FORUM_ADMIN] || values[SYSTEM_ADMIN]);
} ..... }

因此,Forum中各种操作权限是和ForumPermissions定义的用户级别有关系的,作为接口Forum的实现:ForumProxy正是将这种对应关系联系起来.

比如,修改Forum的名称,只有论坛管理者或系统管理者可以修改,代码如下:

public class ForumProxy implements Forum {

private ForumPermissions permissions;
private Forum forum;
this.authorization = authorization; public ForumProxy(Forum forum, Authorization authorization,
ForumPermissions permissions)
{
this.forum = forum;
this.authorization = authorization;
this.permissions = permissions;
} ..... public void setName(String name) throws UnauthorizedException,
ForumAlreadyExistsException
{
  //只有是系统或论坛管理者才可以修改名称
  if (permissions.isSystemOrForumAdmin()) {
    forum.setName(name);
  }
  else {
    throw new UnauthorizedException();
  }
} ... }

而DbForum才是接口Forum的真正实现,以修改论坛名称为例:

public class DbForum implements Forum, Cacheable {
... public void setName(String name) throws ForumAlreadyExistsException {   ....   this.name = name;
  //这里真正将新名称保存到数据库中
  saveToDb();   ....
} ... }

凡是涉及到对论坛名称修改这一事件,其他程序都首先得和ForumProxy打交道,由ForumProxy决定是否有权限做某一样事情,ForumProxy是个名副其实的"网关","安全代理系统".

在平时应用中,无可避免总要涉及到系统的授权或安全体系,不管你有无意识的使用Proxy,实际你已经在使用Proxy了

设计模式之Proxy的更多相关文章

  1. java设计模式之Proxy(代理模式)

    java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...

  2. 设计模式之Proxy(代理)

    设计模式之Proxy(代理) 板桥里人banq http://www.jdon.com 2002/04/21/ 理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水, ...

  3. 设计模式--代理(Proxy)模式

    在公司,经常性听到采购部的人说采购某样东材料,采购不了,需要通过代理商才可以.以前Insus.NET也做有一个练习<找人办事,代理设计模式(Proxy)>http://www.cnblog ...

  4. php设计模式之Proxy(代理模式)和Facade(外观)设计模式

    Proxy(代理模式)和Facade(外观)设计模式它们均为更复杂的功能提供抽象化的概念,但这两种实现抽象化的过程大不相同 Proxy案例中,所有的方法和成员变量都来自于目标对象,必要时,该代理能够对 ...

  5. [学习笔记]设计模式之Proxy

    为方便读者,本文已添加至索引: 设计模式 学习笔记索引 写在前面 “魔镜啊魔镜,谁是这个世界上最美丽的人?” 每到晚上,女王都会问魔镜相同的问题(见Decorator模式).这是她还曾身为女巫时留下的 ...

  6. 设计模式之Proxy(代理)(转)

    理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...

  7. Java设计模式:Proxy(代理)模式

    概念定义 代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 使用代理模式的原因有: 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象, ...

  8. java设计模式之代理设计模式(Proxy)

    一个简单Proxy代理模式范例 interface Subject{ //定义核心主题所要完成的功能 public void make(); } class RealSubject implement ...

  9. 设计模式(12)--Proxy(代理模式)--结构型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. ...

随机推荐

  1. virtio 之后的数据直连

    在上一篇中说了virtio这种半虚拟化方案之后,还有一种全虚拟化的方案,这种全虚拟化的方案中,直接宿主机上的设备,直接被虚拟化成了n个设备,然后这些设备可以直接被加载进guest os中当做一个普通的 ...

  2. 洛谷P3656 展翅翱翔之时 (はばたきのとき)(洛谷2017.3月赛round1 t4)

    题目背景 船が往くよミライへ旅立とう 船只启航 朝未来展开旅途 青い空笑ってる(なにがしたい?) 湛蓝天空露出微笑(想做些什么?) ヒカリになろうミライを照らしたい 化作光芒吧 想就此照亮未来 輝きは ...

  3. jmeter之JDBC的使用

     一.配置JDBC Request 1.添加需要的驱动jar包 使用不同的数据库,我们需要引入不同的jar包. 方式1:直接将jar包复制到jmeter的lib目录 mysql数据库:下载mysql- ...

  4. BZOJ3717 PA2014Pakowanie(状压dp)

    显然贪心地有尽量先往容量大的背包里放.设f[i]为i子集物品最小占用背包数,g[i]为该情况下最后一个背包的剩余容量,转移显然. #include<iostream> #include&l ...

  5. P2891 [USACO07OPEN]吃饭Dining(最大流+拆点)

    题目描述 Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she w ...

  6. Qt浅谈内存泄露(总结)

    Qt浅谈内存泄露(总结) 来源 http://blog.csdn.net/taiyang1987912/article/details/29271549 一.简介 Qt内存管理机制:Qt 在内部能够维 ...

  7. java学习3-Maven的使用

    Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Depen ...

  8. P5028 Annihilate

    P5028 Annihilate 50个串,任意两两的最长公共子串 回忆最长公共子串求法 1.hash+二分 2.SAM 3.SA,属于不同的串的hei的max 1.hash+二分 暴力两两枚举再跑的 ...

  9. 在 Xamarin.Forms 实现页面全屏显示

    NavigationPage.SetHasNavigationBar(this, false); 或者 <ContentPage ... NavigationPage.HasNavigation ...

  10. Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1)A B C 水 并查集 思路

    A. Bear and Big Brother time limit per test 1 second memory limit per test 256 megabytes input stand ...