声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635

在常见的23种设计模式中,static proxy和decorator在代码结构上是特别相似的。那它们的不同具体体现在什么地方呢,本文就通过静态代理模式代码和装饰器模式代码的比较说明这个问题。

本文给出的例子将会尽可能简单的例子,把最核心的接口及继承关系展现出来,以期读者不被繁复的业务逻辑所束缚。

static proxy模式代码如下
接口类

package com.test.designpattern.staticproxyexample;
public interface Subject {void printString(String url);
}

接口实现类

package com.test.designpattern.staticproxyexample;public class ConcreteSubject implements Subject {@Override
public void printString(String url) {String dataFormUrl = mockNetRequest(url);System.out.println("data from internet is :" + dataFormUrl);
}private String mockNetRequest(String url) {return new StringBuilder("data from ").append(url).append(" is:").append("200").toString();
}}

代理类,实现接口类

package com.test.designpattern.staticproxyexample;public class Proxy implements Subject {private Subject subject;public Proxy(Subject subject) {this.subject = subject;
}@Override
public void printString(String url) {System.out.println("This is a proxy server in hongkong, you can accesss google through it");subject.printString(url);
}}

测试类

package com.test.designpattern.staticproxyexample;public class TestStaticProxy {public static void main(String[] args) {//如果这里直接访问ConcreteSubject,将因为各种原因受限而返回404,模拟代码实现作为读者的家庭作业Subject proxySubject = new Proxy(new ConcreteSubject());proxySubject.printString("https://xxx.xxx.xxx");}
}

运行结果如下

This is a proxy server in hongkong, you can accesss google through it
data from internet is :data from https://xxx.xxx.xxx is:200

decorator模式代码如下
接口类
package com.test.designpattern.docoratorexample;

public interface Component  {void printString(String s);
}

接口实现类

package com.test.designpattern.docoratorexample;public class ConcreteComponent implements Component {@Overridepublic void printString(String s) {System.out.println("Input String is:" + s);}
}

抽象装饰类,提供了接口方法的一般实现,也可以不需要这个类

package com.test.designpattern.docoratorexample;public class Decorator implements Component {private Component component;public Decorator(Component c) {component = c;}@Overridepublic void printString(String s) {component.printString(s);}
}

具体装饰类,完善功能

package com.test.designpattern.docoratorexample;public class ConcreteDecoratorA extends Decorator {public ConcreteDecoratorA(Component c) {super(c);}@Override
public void printString(String s) {printPromptMesage();//保留原有的功能super.printString(s);//加强已有的功能printStringLen(s);
}private void printPromptMesage() {System.out.println("begin to output message by decorator A");
}private void printStringLen(String s) {System.out.println("The length of string is:" + s.length());
}}

测试类

package com.test.designpattern.docoratorexample;public class TestDecorator {public static void main(String[] args) {Component myComponent = new ConcreteComponent();myComponent.printString("A test String");Decorator myDecorator = new ConcreteDecoratorA(myComponent);myDecorator.printString("A test String");}
}

运行结果

Input String is:A test String
begin to output message by decorator A
Input String is:A test String
The length of string is:13

单从代码结构上来讲,静态代理模式和装饰器模式是一样的,但是它们有本质的不同,本文作者挑选的2个例子,尽可能把函数名都写成一样的,但是它们的内涵是不一样的。
从意图上来说,Proxy中模拟在本地直接调用接口实现类ConcreteSubject 无法实现而必须经过Proxy才能实现的功能。Decorator中模拟了完善接口实现类ConcreteComponent的功能。
作者在公司工作的时候,有一个功能是实现限流,就是控制存取磁盘数据的数据流量,这时采用的就是装饰器类而非代理类,装饰器装饰的是Java原生的InputStream、OutputStream。

学习设计模式,最应该认真反复学习的书籍当然是“四人帮”编写的《Design Pattern—Elements of Reusable Object-Oriented Software》.

借用其中的一段话表述Proxy和Decorator的区别。
这2种模式都描述了怎样为对象提供一定程度上的间接引用,proxy和decorator对象的实现部分都保留了指向另一个对象的指针,它们向这个对象发送请求。然而,它们具有不同的设计目的。
像Decorator模式一样,Proxy模式构成一个对象并为用户提供一致的接口,但与Decorator模式不同的是,Proxy模式不能动态地添加或分离性质,它也不是为递归组合而设计的。它的目的是,当直接访问一个实体不方便或者不符合需要时,为这个实体提供一个替代者,例如,实体在远程设备上,访问受到限制或者实体是持久存储的。
在Proxy模式中,实体定义了关键功能,而Proxy提供(或拒绝)对它的访问。

Proxy模式访问模型如下:
Client——>Proxy——>ConcreteSubject,目标在ConcreteSubject,如果Client能直接访问到ConcreteSubject,是不会去麻烦Proxy的。

Decorator模式访问模型如下:
Client——>ConcreteDecorator——>ConcreteComponent,此时的目标不是ConcreteComponent了,就是ConcreteDecorator,因为ConcreteDecorator才能提供Client需要的完整功能。比如上文说的IO限流器。

转载于:https://www.cnblogs.com/xsl-thumb-rfcs/p/9941599.html

设计模式讲解2:static proxy和decorator的不同点相关推荐

  1. Java设计模式(7)装饰模式(Decorator模式)

    Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这 ...

  2. Android常见设计模式——代理模式(Proxy Pattern)(二)

    文章目录 1. 前言 2. 远程代理(Remote Proxy) 3. 后记 1. 前言 在上篇Android常见设计模式--代理模式(Proxy Pattern)中基本上知道了什么是代理模式,以及对 ...

  3. 设计模式学习笔记——代理(Proxy)模式

    设计模式学习笔记--代理(Proxy)模式 @(设计模式)[设计模式, 代理模式, proxy] 设计模式学习笔记代理Proxy模式 基本介绍 代理案例 类图 实现代码 Printable接口 Pri ...

  4. Java代码设计模式讲解二十三种设计模式

    设计模式 文章目录 设计模式 一.创造型设计模式 1.1 单例模式 1.1.1 饿汉式单例模式 1.1.2 懒汉式单例模式 (1)线程不安全的情况 (2)线程安全的情况 1. 实例化的方法上加sync ...

  5. 设计模式学习笔记(十)——Decorator装饰模式

    Decorator装饰模式是一种结构型模式,它主要是解决:"过度地使用了继承来扩展对象的功能",由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性:并且随着子类的增多(扩展功 ...

  6. 05、人人都会设计模式:代理模式--Proxy

    PS:转载请注明出处 作者: TigerChain 地址: http://www.jianshu.com/p/1b3b6b003032 本文出自 TigerChain 简书 人人都会设计模式 教程简介 ...

  7. 设计模式之代理模式(Proxy)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  8. 设计模式的征途—10.装饰(Decorator)模式

    虽然目前房价依旧很高,就连我所在的成都郊区(非中心城区)的房价均价都早已破万,但却还是阻挡不了大家对新房的渴望和买房的热情.如果大家买的是清水房,那么无疑还有一项艰巨的任务在等着大家,那就是装修.对新 ...

  9. 设计模式学习3——装饰者模式(Decorator)

    没想到鼻炎还要做手术,这应该是出生到现在的第一个手术吧,据说是个小手术,呵呵,应该没有什么问题吧,不过得有10天左右的手术及休养时间,不知道设计模式的学习会不会被打断,嘿嘿. 装饰者模式        ...

  10. C#设计模式(9)——装饰者模式(Decorator Pattern)

    一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...

最新文章

  1. 分析Booking的150种机器学习模型,我总结了六条成功经验
  2. 揭晓飞桨平台提速秘诀:INT8量化加速实现“事半功倍”
  3. python10-宝可梦数据分析-平民最强宝可梦系列(从0-1数据分析实战)
  4. SpringMVC 全局异常处理,返回json
  5. windows上不同版本的CUDA、cudnn是否能够共用?
  6. 知其然不知其所以然的悲惨后果【EF CodeFirst 实体关系两日游】
  7. Java中注释的使用
  8. python写if语句_python if语句
  9. 基础研究到底要基础到什么程度?
  10. C++ 用遗传算法解决TSP问题,旅行商问题
  11. iOS如何检测app从后台调回前台
  12. linux 查看网络流量
  13. 网络管理员必备:Windows日志的保护与伪造
  14. 翻译: 4.1 多层感知器MLP Multilayer Perceptrons pytorch
  15. 基于Arduino的双向交通灯系统
  16. 人工智能常用英文缩写
  17. R——关联规则分析(二 例题:中医证型的关联规则挖掘)
  18. 线程切换哪家强?RxJava与Flow的操作符对比
  19. 波士顿房价的三种预测方式(模型预测,最小二乘法,多元线性回归)
  20. python中国剩余定理-中国剩余定理 Python实现

热门文章

  1. python无法定位到table_selenium3 + python - table定位
  2. python中的fun_Python fun中*args,**kwargs参数的含义和用法(*args,**kwargs),Pythonfunargskwargs,及...
  3. 会场安排问题和NYOJ966
  4. auto cad 打印颜色变浅_CAD初学者最容易忽视的CAD打印线宽问题,你“中枪”了吗?...
  5. STM32——库函数版——数码管流动显示程序
  6. python机器学习搭建空气质量AQI(air quality index)预测模型
  7. 折纸机器人的步骤图解_简单折纸:折叠小吉普车(步骤图解)
  8. 实心和空心哪个抗弯能力强_为什么轮胎不设计成实心的?不怕爆胎 480阅读
  9. oracle11g是什么语言,oracle11g下载
  10. C/C++[1928, ]日期处理