- 浏览: 116190 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
ccfangle:
bestchenwu 写道什么时候用“==”还是“equals ...
操作符“==”与对象的equals()方法 -
bestchenwu:
什么时候用“==”还是“equals()”,跟你是把这个对象作 ...
操作符“==”与对象的equals()方法
呵,从翻译这个标题开始这个模式学习吧:
The use of layered objects to dynamically and transparently add
responsibilities to individual objects is referred to as the decorator
pattern.--利用多层对象动态、透明地给一个对象添加功能,称之为装饰模式(或者是:
Decorator模式指的是,利用通过层组织起来的多个对象,以动态、透明地方式,来给某单个对象增加新功能,我自己的翻译是:通过将对象分层,然后动态、透明地给一个对象添加功能的应用称之为Decorator模式。真是不好翻译,得好好学习语法了!)
以下这个参考例子和教材中差不多,但是更形象一些!(图比较酷)
http://www.blogjava.net/sterning/archive/2008/01/21/176679.html
实际上,装饰器模式我已经是学习过了,不过没有看懂,都不知道这个有什么作用,尤其是看过的一些例子,不是很有舒服里,尤其是什么打桩、挖坑、钉木板这个例子,很是让我迷惑,感觉和Proxy设计模式没有什么区别!
仔细分析之后,感觉还是区别蛮大,但是需要实践的道理还是没有变,只有在实践当中,才能够发现应用的实际操作方式。只是一味的模仿、从概念和简单样例中是体会不到模式应用的精髓啊!
<1>
proxy模式指:客户端调用某个类的某个方法,其实是通过proxy来调用的,而客户本身并不知道。比如: 调用某个Shop.order()方法:
客户端的代码看起来如下:
IShop shop = new Proxy(); // 创建一个代理对象
shop.order(); // 调用代理的方法
Shop类和Proxy类继承自共同的接口IShop,因此客户端引用IShop不能区分是不是Proxy
接口IShop定义商业方法order(), Shop类实现该方法,而Proxy类也实现该方法,不过实现方法为:
class Proxy implements IShop {
public void order() {
// 先检查:
if(check()) {
// 再调用:
this.shop.order(); // Proxy对象保持一个Shop类的引用
// 还可进行扫尾工作
}
}
}
这样在客户端根本不需要对每调用一个远程方法作用户权限,身份等检查,客户端针对Proxy编程,Proxy对象对每个方法调用前都可做检查,真正的商业类可以申明为非public,对客户端不可见。
实现Proxy模式需要:
一个接口Interface 定义必要的方法
一个实现类,实现真正的方法,但不做任何用户检查
一个代理类,包含一个实现类的引用,对每个方法调用可进行必要检查
客户端由 Interface proxy = new Proxy()得到Proxy的引用,却不能区分是
Proxy还是真正的实现类,然后对此引用操作。
Proxy模式的典型应用就是EJB模型。客户端不与EJB对象(相当于实现类)直接作用,而是通过容器(相当于代理)调用EJB对象,容器会对用户调用作检查。
微软的DCOM模型也可看作Proxy模式,RPC可截获客户端对一个远程COM对象的调用,然后真正调用该远程对象并返回结果,客户端根本不知道自己调用的是一个远程对象,而以为是本地对象(因为DCOM调用代码和本地调用是一样的)。
<2>
Decorator 模式是为了增强某个类的功能,典型的应用如java的stream流:
例如java的FileInputStream有read()方法,但不提供缓冲,应用decorator模式将
FileInputStream装饰成有缓冲的stream:
InputStream in = new BufferedInputStream(new FileInputStream( "C:\\1.txt "));
客户端调用in.read()不知道实际的read功能是由哪个类具体提供的,也分辨不出in的具体类型,因为只有对接口的引用。这种是透明的装饰模式。
透明装饰模式的关键是客户端只针对接口编程(InputStream是抽象类也是BufferedInputStream和FileInputStream的超类)。
不透明的装饰模式:装饰类可以提供额外的方法来增强某些功能,例如:
FileInputSteam没有readLine()而BufferedInputStream有readLine(),为了使用额外的功能,客户端不得不把in的类型申明为:
BufferedInputStream in = new BufferedInputStream(new
FileInputStream( "C:\\1.txt "));
优点是可以使用新的额外方法:in.readLine()
缺点是客户端必须确切知道装饰类提供哪些额外的方法。
//实际的做法就是:好好看看源码...
以 java.io.InputStream 为例,下图是类结构图:
InputStream是一个抽象类,是所有数据形式为字节的输入流的父类,为基于字节的数据输入定义了基本操作方法。实际 上,InputStream的子类大部分都没有增加任何其他的接口函数(在上面的类结构图中就可以发现),因此在看InputStream子类的时候,我 们主要学习其构造函数。
Java I/O中是如何采用Decorator(装饰)模式的呢?下面为大家详细说明,看到FilterInputStream类(也就前面说的过滤流,后面你会 发现更多的过滤流),你是否发现了?对,就是FilterInputStream类,她就相当于Decorator(装饰)模式中的Decorator 类,而且的BufferedInputStream、DataInputStream、PushbackInputStream则相当于是 ConcreateDecorator,如下图所示:
那么Java
I/O中到底是如何使用的了?Decorator(装饰)模式的主要意图是:动态地给一个对象添加一些额外的职责,这句话很抽象,我们结合Java
I/O举个具体的例子:比如说我们读取文件,首先打开文件获取到File,然后我们再创建一个FileInputStream,然后读取文件。读取文件是
一个很费时的操作,尤其是需要多次的读写文件。
例如,BufferedInputStream实现了对数据读取的缓冲机制,通过FileInputStream来 读取数据,BufferedInputStream将已经读取的数据存储到缓冲区,BufferedInputStream相当于对 FileInputStream进行了“装饰”。
File file = new File(“c:\\moandroid.txt”,true);
InputStream is = new BufferedInputStream(new FileInputStream(file));
如果没有应用Decorator模式的话,就只能应用:
InputStream is =new FileInputStream(file);
这样就失去了缓存处理操作,增加了I/O等待时间,没有获得很高的效率.....
更多解析可以查看:http://apps.hi.baidu.com/share/detail/51853225
综合,自己学习的过程,用意去区别各种模式的不同是需要的,但是,更重要的是在实际应用中取提取这种模式案例,这个是学习的很好途径。具体到Decorator和Proxy的区别,<1>Decorator是需要功能上的增强,根据用户的具体应用需求来添加各种功能,这在客户端应用时很是方便。要是透明处理,直接就是返回了接口部分。 对于后者来说,完成的任务主要是在安全等方面,将具体逻辑模块和验证模块解耦。如果你非要在这里加上一些增强型功能(很多时候是不必要的),也是可以的。所以,更具不同应用场景来区分设计模式也是有道理的!<2>这个在上面的评论中也做了介绍。至于具体的应用内容,还需要后续的不断学习中逐步深入、熟悉!~
发表评论
-
25-设计模式学习总结
2012-02-06 15:42 1014在学习Thinking in patterns之前 ... -
24-Prototype
2012-02-06 14:56 891Prototype(原型模式):用原型实例指定创建 ... -
23-Interpreter
2012-02-05 14:51 928If the application user n ... -
22-Visitor
2012-02-05 11:12 872The assumption is that yo ... -
21-Memento
2012-02-03 17:57 947Use serialization to crea ... -
20-Chain of responsibility
2012-02-03 16:25 974Chain of Responsibility ... -
19-Command: choosing the operation at run-time
2012-02-01 17:45 964A Command is a function o ... -
18-Facade
2012-01-15 15:22 925Facade模式 : 为子系统中的一组接口提供一个一致的 ... -
17-Mediator
2012-01-14 19:40 856Mediator模式:用一个中介对象来封装一系列 ... -
16-Observer
2012-01-12 21:35 777好久之前看过Observer,但是,当时不是很清楚 ... -
15-Composite
2012-01-12 10:11 864Composite模式,有时又叫做部分-整体模式(Pa ... -
14-Bridge
2012-01-11 17:06 844思考了好一阵,总 ... -
13-Adapter
2012-01-10 21:38 795接下来的两个模式目的就是:Connecting differe ... -
11-Flyweight: too many objects
2012-01-06 16:10 947The odd thing about flyweight, ... -
10-Builder
2012-01-06 09:14 829The goal of builder is to separ ... -
9-Factory method(Simple Factory method&Abstract factories)
2012-01-03 19:16 867//工厂方法的理解比较容易,重要还是如何在实践中应用。以下范例 ... -
8-Template method
2012-01-01 20:50 738An application framework allow ... -
7-Policy: generalized strategy
2012-01-01 15:58 1140Although GoF says that Policy i ... -
6-Strategy: choosing the algorithm at run-time
2011-12-29 10:40 1033Strategy : choosing the alg ... -
5-Iterators: decoupling algorithms from containers
2011-12-27 15:39 886In the process, he realized th ...
相关推荐
@ redtea / craco-parameter-decorator 这个插件将为您的项目设置 。 支持: create-react-app:3.x,4.x craco:5.x,6.x :hammer_and_wrench: 安装 纱 $ yarn add -E @redtea/craco-parameter-decorator NPM...
koa-swagger-decorator 使用装饰器自动生成swagger json文档 安装 npm install koa-swagger-decorator 贡献指南 请参考创建PR或发行前。 介绍 Koa Swagger装饰器 使用装饰器自动生成swagger json文档,添加对...
npm i -S nuxt-property-decorator 或者 yarn add nuxt-property-decorator Nuxt JS指令 它可以与Nuxt JS一起使用。 Nuxt TS指令 它可以与Nuxt TS一起使用。 装饰和助手 有以下装饰器: Nuxt特定的装饰器 @Off $ ...
`vue-property-decorator`是一个库,它是Vue.js和TypeScript的结合,提供了装饰器来帮助我们在TypeScript中更好地声明和管理组件的属性。它使得我们可以利用TypeScript的强类型系统,提高代码的可维护性和可读性。...
Spring Boot数据源装饰器 Spring Boot自动配置以与 增加了拦截和记录sql查询的功能,包括拦截大多数Connection , Statement... 通过部署属性decorator.datasource.enabled=true/false禁用装饰 通过spring属性applica
eslint插件使用装饰器 这是eslint的自定义插件,可在方法上强制使用装饰... " use-decorator/use-decorator " : [ 1 , { " params " : [ { " name " : " assertParameter " , " public " : true } ], " methods
安装npm install react - bind - decorator -- save用法: import reactbind from 'react-bind-decorator' ;@ reactbind ( )class Foo extends React . Component { // Bound boundMethod ( arg , i ) { ... } // ...
Vue装饰器注入ES6装饰器对Vue.js的依赖注入安装如果您使用的是Webpack或类似产品: npm i --save-dev vue-decorator-inject 否则,-- --save可能更明智。介绍该库将容器与类似于Symfony中的容器的接口结合在一起,并...
npm install --save react-global-event-decorator 这个是来做什么的? 当您单击DOM中的任意位置时,曾经有一个React组件需要执行操作吗? 它要求您编写如下代码: componentDidMount ( ) { window . ...
超时装饰器安装从源代码: python setup.py install从pypi: pip install timeout-decorator用法import timeimport timeout_decorator@timeout_decorator.timeout(5)def mytest(): print("Start") for i in range(1,...
npm i memo-decorator --save 配置 export interface Config { resolver ?: Resolver ; cache ?: MapLike ; } Resolver是一个函数,它返回要用于给定参数集的键。 默认情况下,解析器将使用方法的第一个参数作为...
xtal-decorator是一个Web组件,能够在其他DOM元素(自定义或其他)上创建强大的深色魔术咒语。 xtal-decorator与和一起是组件的一部分。 xtal-deco和xtal-decor努力。 他们坚持选择加入的原则-要求DOM元素通过...
composer require imanghafoori/laravel-decorator 什么是"Decorator" :red_question_mark: 装饰器是可调用的,它包装原始装饰的可调用对象,以形成由前两个组成的新可调用对象。 就像一条Python蛇吞下了整个鹿,...
es7-checktypes-decorator v0.2.1 一个简单的es7装饰器,用于控制您的类和方法的参数类型或实例。 如果装饰器检测到异常,它将抛出ArgumentTypeError并显示一条消息,指出错误的参数。安装配置babel以使用装饰器: ...
babel-plugin-remove-decorator Babel 6插件可删除所有装饰器,在运行单元测试时非常有用 从顶级类中删除装饰器,例如: 前: @ MyDecorator class Content { } 后: class Content { } 对于项目的任何进一步...
eslint-plugin-decorator-position 一个ESlint插件,它提供一组规则以强制一致的装饰器位置 :red_exclamation_mark: 要求 >= 5 >= 8.5 :rocket: 用法1.安装插件yarn add --dev eslint-plugin-decorator-position ...
npm i koa-decorator 然后在代码中使用: import { HttpMethod , route } from 'koa-decorator' ; @ route ( '/monitor' ) export default class MonitorCtrl { @ route ( '/alive' , HttpMethod . GET ) async ...
执照麻省理工学院执照安装npm i -S vue-property-decorator用法有几个装饰器和1个功能(Mixin): @Component (由) Mixins (由提供的名为mixins的辅助函数)也可以看看@Prop(options: (PropOptions | Constructor...
嗨,react-validate-decorator是es6 react项目的验证插件。 这个想法的灵感来自于, 和 。 我还添加了装饰器如何在该项目中与React一起工作的方式。 您可能会喜欢或讨厌这些想法,但请留下您的评论,以便我有所改进...
自动绑定装饰器 一个类或方法的装饰,其结合到该实例的方法所以this是总是...npm install autobind-decorator 支持平台 输出 我们针对IE11 +浏览器(请参见 )进行以下警告: main :ES5 module :ES5 + ES模块可启