当前位置: 首页 > news >正文

做互联网小程序 和网站有没有前景有口碑的南通网站建设

做互联网小程序 和网站有没有前景,有口碑的南通网站建设,网站制作ppt,苏州专业网站设计文章目录 一、装饰器模式的定义二、个人理解举个抽象的例(可能并不是很贴切) 三、例子1、菜鸟教程例子1.1、定义对象1.2、定义装饰器 3、JDK源码 ——包装类4、JDK源码 —— IO、OutputStreamWriter5、Spring源码 —— BeanWrapperImpl5、SpringMVC源码 …

文章目录

  • 一、装饰器模式的定义
  • 二、个人理解
    • 举个抽象的例(可能并不是很贴切)
  • 三、例子
    • 1、菜鸟教程例子
      • 1.1、定义对象
      • 1.2、定义装饰器
    • 3、JDK源码 ——包装类
    • 4、JDK源码 —— IO、OutputStreamWriter
    • 5、Spring源码 —— BeanWrapperImpl
    • 5、SpringMVC源码 —— HttpHeadResponseDecorator
  • 四、其他设计模式

一、装饰器模式的定义

  • 别名:包装模式(Wrapper Pattern)
  • 类型:结构型模式。
  • 目的:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责额外功能。

二、个人理解

给对象添加新功能时,并不是在对象类中直接添加,而是在装饰器类中添加。
在装饰类中添加新功能,你可以增强原先对象的方法,也可以给对象新增一个方法。

举个抽象的例(可能并不是很贴切)

假设要给人类添加开炮功能。
但由于这是人类,咱们不能通过继承直接给人类添加开炮功能
所以我们就得通过组合,将机器和人类组合起来、通过变相实现人类可以开炮。
这个机器就是装饰器。

  • 坦克 + 人类 ,实现开炮功能
  • 高达 + 人类 ,实现开炮功能

三、例子

1、菜鸟教程例子

菜鸟教程的例子都将对象和装饰器进行了抽象处理,实现了可替换对象和装饰器的实现类。
菜鸟教程原例子
个人觉得这样理解装饰器太绕了,下面的例子就只保留了对象和装饰器

1.1、定义对象

定义一个圆的对象

public class Circle{@Overridepublic void draw() {System.out.println("Shape: Circle");}
}

1.2、定义装饰器

新增setRedBorder方法去设置红色边框。

public class RedCircleDecorator{private Circle c;public RedCircleDecorator(Circle c) {this.c = c;}@Overridepublic void draw() {decoratedShape.draw();         setRedBorder(decoratedShape);}private void setRedBorder(Circle decoratedShape){System.out.println("Border Color: Red");}
}

但我觉这个菜鸟这个例子并不能把装饰器模式特点表现出来
因setRedBorder是私有,并且只是把原先draw方法进行了增强。
这样的话,代理模式也能实现,代理模式也能增强原有的方法,所以这里并不能把装饰器模式特点表现出来
所以我改了一下。

public class ColorCircleDecorator{private Circle c;public RedCircleDecorator(Circle c) {this.c = c;}@Overridepublic void draw() {decoratedShape.draw();System.out.println("画了个普通的圆");         }public void drawRedCircle(Circle decoratedShape){decoratedShape.draw();System.out.println("画了个红色的圆");}public void drawBlueCircle(Circle decoratedShape){decoratedShape.draw();System.out.println("画了个蓝色的圆");}
}

这个例子保留了原先的draw功能,又新增了drawRedCircle和drawBlueCircle功能。

3、JDK源码 ——包装类

包装类也运用了装饰器模式。
将基本类型 转 包装类 的同时,还提供各种转换类型的功能。

4、JDK源码 —— IO、OutputStreamWriter

OutputStreamWriter同时运用了装饰器模式+适配器模式。
这里我们拿装饰器部分来讲。

FileOutputStream fos = new FileOutputStream(new File("Y:/学习资料.md"));
OutputStreamWriter osw = new OutputStreamWriter(fos);
osw.append("新资料xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

原本FileOutputStream 是原本没有append功能的,
而在中OutputStreamWriter 添加append功能。
源码:

public class OutputStreamWriter extends Writer {private final StreamEncoder se;public OutputStreamWriter(OutputStream out) {super(out);se = StreamEncoder.forOutputStreamWriter(out, lockFor(this),out instanceof PrintStream ps ? ps.charset() : Charset.defaultCharset());}@Overridepublic Writer append(CharSequence csq) throws IOException {if (csq instanceof CharBuffer) {se.write((CharBuffer) csq);} else {se.write(String.valueOf(csq));}return this;}
}

可以看到虽然OutputStreamWriter 重写了append方法。
但构造器里OutputStream又被新的装饰器StreamEncoder接收。
而StreamEncoder类就已经通过继承Writer 增加了append方法。

public final class StreamEncoder extends Writer {private final OutputStream out;private StreamEncoder(OutputStream out, Object lock, CharsetEncoder enc) {super(lock);this.out = out;this.ch = null;this.cs = enc.charset();this.encoder = enc;this.bb = ByteBuffer.allocate(INITIAL_BYTE_BUFFER_CAPACITY);this.maxBufferCapacity = MAX_BYTE_BUFFER_CAPACITY;}public static StreamEncoder forOutputStreamWriter(OutputStream out, Object lock, Charset cs) {return new StreamEncoder(out, lock, cs);}
}

5、Spring源码 —— BeanWrapperImpl

BeanWrapperImpl类是对BeanWrapper接口的默认实现,它包装了一个bean对象,缓存了bean的内省结果,并可以访问bean的属性、设置bean的属性值。

BeanWrapperImpl功能还挺复杂的,大家可以自行去看源码,我就不贴出来了。

5、SpringMVC源码 —— HttpHeadResponseDecorator

HttpHeadResponseDecorator 给ServerHttpResponse 添加了writeWith、writeAndFlushWith的功能。

public class HttpHeadResponseDecorator extends ServerHttpResponseDecorator {public HttpHeadResponseDecorator(ServerHttpResponse delegate) {super(delegate);}public final Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {return this.shouldSetContentLength() && body instanceof Mono ? ((Mono)body).doOnSuccess((buffer) -> {if (buffer != null) {this.getHeaders().setContentLength((long)buffer.readableByteCount());DataBufferUtils.release(buffer);} else {this.getHeaders().setContentLength(0L);}}).then() : Flux.from(body).doOnNext(DataBufferUtils::release).then();}private boolean shouldSetContentLength() {return this.getHeaders().getFirst("Content-Length") == null && this.getHeaders().getFirst("Transfer-Encoding") == null;}public final Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body) {return this.setComplete();}
}

四、其他设计模式

创建型模式
结构型模式

  • 1、设计模式——装饰器模式(Decorator Pattern)+ Spring相关源码

行为型模式

  • 1、设计模式——访问者模式(Visitor Pattern)+ Spring相关源码
  • 2、设计模式——中介者模式(Mediator Pattern)+ JDK相关源码
http://www.15wanjia.com/news/179829.html

相关文章:

  • 程序员做网站类网站医院官方网站建设
  • 建设银行网站官方网站怎样增加网站浏览量
  • 有什么做动图比较方便的网站三种WordPress引流方法
  • 网站申请要多少钱贵州安顺网站建设
  • 景安网站备案要多久网站添加新关键词
  • wordpress做视频网站吗宣传手册设计
  • 仓库改造类网站怎么做河南视频网站建设公司
  • 网站推广方案策划工商网站查询个人信息
  • 高端网站定制开发设计制作做网站都要多少钱
  • soho的外贸网站搜索引擎yandex入口
  • 怎么增加网站反链深圳东门老街
  • 国产做爰网站视频网站logo怎么做的
  • 邵阳优秀网站建设mui做的h5网站案例
  • 万全做网站wl17581营销型网站建设的意义
  • 做a视频网站拓者吧官网
  • 绘本馆借阅网站开发无锡网站建设专家
  • 百度网站v2升级到v3怎么做企业系统管理平台
  • 网站开发协议合作个人建设网站论文
  • 网站备案ftp密码广州新闻最新消息10条
  • 河北省建设部网站网站开发前台开发
  • 舟山企业网站建设公司企业网站建设感想
  • 杭州制作网站的公司简介wordpress优化教程
  • 重庆企业免费建站免费素材网站素材库
  • 上海建设厅焊工证查询网站国际贸易综合服务平台
  • 淘宝优惠劵做网站模版开发一个平台app需要多少钱
  • 电子商务网站建设新手企业网站设计好的缺点有哪些
  • 公司网站页脚专做耐克阿迪鞋网站
  • php企业网站模板下载自己制作的网站上传到服务器后怎么原来的网页没有变
  • 化纤公司网站建设上海网站建设开发公司
  • 农村建设集团有限公司网站首页电商网站建设效果