装饰图案

装饰图案

装饰 我不经常使用的一种设计模式是Decorator 。 我不确定为什么这种模式不受欢迎,因为它很方便。 装饰器模式允许以受控方式向对象添加功能。 即使在使用静态类型的语言时,也可以在运行时运行! 装饰器模式是子类的替代方法。 子类化在编译时增加了行为,并且更改会影响原始类的所有实例; 装饰可以在运行时为单个对象提供新的行为。 装饰器模式是遵守打开/关闭原则的好工具。

一些示例可能显示此模式的价值:

示例1:HTTP身份验证

想象一下一个HTTP客户端,例如与RESTful服务对话的客户端。

该服务的某些部分可公开访问,但某些部分需要用户登录。当客户端尝试访问受保护的资源时,RESTful服务将以401 Unauthorized状态码响应。

更改客户端以处理401会导致重复,因为每个调用都可能需要身份验证 。 因此,我们应该将身份验证代码提取到一个位置。 但是那个地方在哪里?

这是Decorator模式出现的地方:

public class AuthenticatingHttpClientimplements HttpClient {private final HttpClient wrapped;public AuthenticatingHttpClient(HttpClient wrapped) {this.wrapped = wrapped;}@Overridepublic Response execute(Request request) {Response response = wrapped.execute(request);if (response.getStatusCode() == 401) {authenticate();response = wrapped.execute(request);}return response;}protected void authenticate() {// ...}}

REST客户端现在不再需要担心身份验证,因为AuthenticatingHttpClient处理AuthenticatingHttpClient

示例2:缓存授权决策

OK,因此用户已登录,REST服务器知道她的身份。 它可能决定允许一个人访问某个资源,而不允许另一个人访问。

IOW,它可以使用XACML来实现授权 。 在这种情况下, 策略决策点 (PDP)负责决定访问请求。

检查权限通常很昂贵,尤其是当权限变得更细粒度并且访问策略更加复杂时。 由于访问策略通常不会经常更改,因此这是缓存的理想选择。

这是装饰器模式可能派上用场的另一个实例:

public class CachingPdp implements Pdp {private final Pdp wrapped;public CachingPdp(Pdp wrapped) {this.wrapped = wrapped;}@Overridepublic ResponseContext decide(RequestContext request) {ResponseContext response = getCached(request);if (response == null) {response = wrapped.decide(request);cache(request, response);}return response;}protected ResponseContext getCached(RequestContext request) {// ...}protected void cache(RequestContext request, ResponseContext response) {// ...}}

如您所见,代码与第一个示例非常相似,这就是为什么我们将其称为模式。

正如您可能从这两个示例中猜到的那样,Decorator模式对于实现跨领域的关注点非常有用,例如身份验证,授权和审核的安全功能,但这当然不是唯一的亮点。

如果您仔细看,我相信您将能够发现更多使这种模式起作用的机会。

参考: 安全软件开发博客中来自JCG合作伙伴 Remon Sinnema 的Decorator Pattern 。

翻译自: https://www.javacodegeeks.com/2014/01/the-decorator-pattern.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Neural Networks

神经网络能够使用torch.nn包构建神经网络。 现在你已经对autogard有了初步的了解,nn基于autograd来定义模型并进行微分。一个nn.Module包含层,和一个forward(input)方法并返回output。 以如下分类数字图片的网络所示: 这是一个简单的前馈网络…

文件服务器磁盘配额管理,Windows2008 (FSRM)文件服务器资源管理器网站文件夹磁盘配额管理...

在windows server里提供了一个功能强大的管理工具,就是文件服务器资源管理器。简称FSRM(File Server Resource Manager)通过此工具,可能对网站进去配额以及相关服务。我们通过使用FSRM,可以为文件夹和卷设置配额,主动屏蔽文件&…

SpringBoot项目中,获取配置文件信息

1.在配置文件中设置信息,格式如下 wechat:mpAppId: wxdf2b09f280e6e6e2mpAppSecret: f924b2e9f140ac98f9cb5317a8951c71 如果是多级目录,则 project:url:sell: http://localhost:8080 2.获取配置文件信息(三种方法) 2.1Configurat…

oppo 手机侧滑快捷菜单_OPPO刚秀出卷轴屏手机,就被打了一记响亮的“耳光”

在刚刚过去的未来科技大会上,我国国产手机厂商 oppo可谓是出尽了风头,因为他们推出一款名叫“OPPO X 2021”的卷轴屏概念手机,并且展出了可操作的概念机实物,着实让所有人都惊艳了一把。因此我国的一些自媒体又嗨了,用…

UVA1602 Lattice Animals 搜索+剪枝

题目大意 给出一个$w\times h$的网格,定义一个连通块为一个元素个数为$n$的方格的集合$A,\forall x\in A, \exists y\in A$,使得$x,y$有一条公共边。现要求一个元素个数极多的连通块的集合$K_N$,使得$\forall A,B\in K_n$,不存在一…

python怎么打开程序管理器_Python 进程管理工具 Supervisor 使用教程

因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新。请访问我的个人网站获取这篇文章的最新内容,Python 进程管理工具 Supervisor 使用教程 Supervisor 是基于 Python 的进程管理工具,只能运行在 Unix-Like 的系统上&#xff…

ft服务器设置传输协议,ft服务器设置成主动模式

ft服务器设置成主动模式 内容精选换一换如果您选择使用SFS Turbo实现文件共享存储,此章节操作可跳过,您可以参见《SAP HANA用户指南》中的“格式化磁盘”章节,挂载Backup卷。NFS Server磁盘需要格式化,并挂载到相应的目录后&#…

mysql text字段导出_Mysql数据库的各种命令:

一、连接MYSQL格式: mysql -h主机地址 -u用户名 -p用户密码1、连接到本机上的MYSQL。 首先打开DOS窗口,然后进入目录mysqlbin,再键入命令mysql -u root -p,回车后提示你输密码. 注意用户名前可以有空格也可以没有空格,…

运行,JUnit! 跑!!!

JUnit与JavaScript和SVN一起是程序员经常开始使用的一些技术,甚至没有读过一篇博客文章,更不用说一本书了。 也许这是一件好事,因为它们看起来足够简单且易于理解,因此我们无需任何手册即可立即使用它们,但这也意味着它…

css3图形绘制

以下几个例子主要是运用了css3中border、bordr-radius、transform、伪元素等属性来完成的,我们先了解下它们的基本原理。 border:简单的来说border语法主要包含(border-width、border-style、border-color)三个属性。 „ border-t…

vueh5调用摄像头拍照_潜望式拍照5G手机盘点:售价相差数千元 究竟怎么选?

【dogkeji-科技犬】最近很多网友询问科技犬,目前支持50X潜望式长焦手机都有哪些,可否进行相关手机的推荐,今天就应大家的需求来盘点一下,给各位网友一些参考。推荐一,三星 Galaxy S20 U三星Galaxy S20 5G系列不仅搭载了…

09 事件对象

上篇介绍完我们js的事件流的概念之后,相信大家对事件流也有所了解了。那么接下来我们看一下jquery的事件操作。 在说jquery的每个事件之前,我们先来看一下事件对象 事件对象 Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状…

使用Struts2,Hibernate和MySQL创建个人MusicManager Web应用程序的研讨会

概述: 在本研讨会教程中,我们将使用Struts 2,Hibernate和MySQL数据库开发一个个人音乐管理器应用程序。 该Web应用程序可用于将您的音乐收藏添加到数据库中。 我们将显示用于添加唱片的表格,并在下面显示所有音乐收藏。 通过单击“…

链表快速排序python_Python一行代码实现快速排序的方法

今天将单独为大家介绍一下快速排序! 一、算法介绍 排序算法(Sorting algorithm)是计算机科学最古老、最基本的课题之一。要想成为合格的程序员,就必须理解和掌握各种排序算法。其中"快速排序"(Quicksort&…

自定义滚动条样式

啥都不说先看图: 注: 只适合chrom,不适用IE和fireFox 下面展示代码: 1 <html lang"en">2 <head>3 <meta charset"UTF-8">4 <title>CSS3自定义滚动条-轩枫阁</title>5 <style>6 header7 {8 font-family: …

rust为什么显示不了国服_Rust编程语言初探

静态、强类型而又不带垃圾收集的编程语言领域内&#xff0c;很久没有新加入者参与竞争了&#xff0c;大概大部分开发者认为传统的C/C的思路已经不太适合新时代的编程需求&#xff0c;即便有Ken Tompson这样的大神参与设计的golang也采用了GC的思路来设计其新一代的语言&#xf…

wps表格粗线和细线区别_详解论文中的表格技术

今天我们主要学习的技能如下&#xff1a;• 怎样用word做论文要求的三线表• 三线表中辅助线的断开• 表格或者图片自动编号1. 先普及一下&#xff0c;论文中的三线表吧。三线表以其形式简洁、功能分明、阅读方便而在科技论文中被推荐使用。三线表通常只有3条线&#xff0c;即顶…

如何自定义CSS滚动条的样式?

欢迎大家前往腾讯云 社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 本文由前端林子发表 本文会介绍CSS滚动条选择器&#xff0c;并在demo中展示如何在Webkit内核浏览器和IE浏览器中&#xff0c;自定义一个横向以及一个纵向的滚动条。 0.需求 有的时候我们不想使用浏览器默…

RabbitMQ基础知识

RabbitMQ基础知识 一、背景RabbitMQ是一个由erlang开发的AMQP&#xff08;Advanced Message Queue &#xff09;的开源实现。AMQP 的出现其实也是应了广大人民群众的需求&#xff0c;虽然在同步消息通讯的世界里有很多公开标准&#xff08;如 COBAR的 IIOP &#xff0c;或者是 …

iview 级联选择组件_使用 element-ui 级联插件遇到的坑

需求描述【省市区三级联动】组件&#xff1a;Cascader 级联选择器后端需要所选中的地区的名字&#xff0c;如&#xff1a;[北京市, 北京市, 东城区]获取后端省市区具体列表的接口返回数据&#xff1a;// 省 - 参数1 [{value: 1,label: 北京市},... ] // 市 - 参数2 [{value: 1,…