一个简易网站怎么做,营销代码是什么,网站建设方案200字,网站开发tahmwlkj文章目录 一、装饰器模式的定义二、个人理解举个抽象的例#xff08;可能并不是很贴切#xff09; 三、例子1、菜鸟教程例子1.1、定义对象1.2、定义装饰器 3、JDK源码 ——包装类4、JDK源码 —— IO、OutputStreamWriter5、Spring源码 —— BeanWrapperImpl5、SpringMVC源码 … 文章目录 一、装饰器模式的定义二、个人理解举个抽象的例可能并不是很贴切 三、例子1、菜鸟教程例子1.1、定义对象1.2、定义装饰器 3、JDK源码 ——包装类4、JDK源码 —— IO、OutputStreamWriter5、Spring源码 —— BeanWrapperImpl5、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 MonoVoid 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 MonoVoid writeAndFlushWith(Publisher? extends Publisher? extends DataBuffer body) {return this.setComplete();}
} 四、其他设计模式
创建型模式 结构型模式
1、设计模式——装饰器模式Decorator Pattern Spring相关源码
行为型模式
1、设计模式——访问者模式Visitor Pattern Spring相关源码2、设计模式——中介者模式Mediator Pattern JDK相关源码