您现在的位置是:首页 > 正文

装饰者模式

2024-01-30 20:29:29阅读 0

设计模式:专门为解决某一类问题,而编写的固定格式的代码。

装饰者模式

一、职责

1、动态的为一个对象增加新的功能

2、装饰模式是一种用于替代继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀

二、实现细节

1、Component抽象构件角色:

真实对象和装饰对象有相同的接口。这样,客户端对象就能够以与真实对象相同的方式同装饰对象交互。

2、ConcreteComponent 具体构件角色(真实对象):

io流中的FileInputStream、FileOutputStream

3、Decorator装饰角色:

持有一个抽象构件的引用。装饰对象接受所有客户端的请求,并把这些请求转发给真实的对象。这样,就能在真实对象调用前后增加新的功能。

4、ConcreteDecorator具体装饰角色:

负责给构件对象增加新的责任。

三、开发中使用的场景

1、 Servlet API 中的request

Servlet API 中提供了一个request对象的Decorator设计模式的默认实现类HttpServletRequestWrapper,HttpServletRequestWrapper类,增强了request对象的功能。

类图关系如下:

应用:解决get提交的乱码问题

import java.io.IOException;
import java.io.UnsupportedEncodingException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class CharacterEncoding implements Filter{

	public void destroy() {

	}

	public void init(FilterConfig arg0) throws ServletException {
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		chain.doFilter(new HttpServletRequestWrapper((HttpServletRequest)request){
			public String getParameter(String name) {
				if("get".equals(this.getMethod().toLowerCase())) {
					String value = super.getParameter(name);
					if(value != null)
					try {
						return new String(value.getBytes("iso-8859-1"),"utf-8");
					} catch (UnsupportedEncodingException e) {
						e.printStackTrace();
					}
				}
				return super.getParameter(name);
			}
		}, response);
	}
}

2、connection中的close()

重写close方法,使connection用完后重新添加到连接池中去,而不是关闭资源:

MyConnection:(装饰者)

public class MyConnection implements Connection{

	//1、存放Connction的另一个实现类
	private Connection conn;
	private LinkedList<Connection> list;
	
	//2、构造方法,吧Connection的另一个实现类作为成员变量写入
	public MyConnection(Connection conn,LinkedList<Connection> list) {
		this.conn = conn;
		this.list = list;
	}

	//3、重写prepareStatement(String sql)方法
	public PreparedStatement prepareStatement(String sql) throws SQLException {
		
		return conn.prepareStatement(sql);
	}

	//4、重写close()方法
	public void close() throws SQLException {
		list.add(conn);
	}
。。。。。。。。。。。其他方法
}

3、IO中输入流和输出流设计

(1)InputStream:

关系类图:

  1. inputStream中有个read()抽象方法
  2. 具体实现类中都实现了该类
  3. FilterInputStream中有一个InputStream的引用,用来存被装饰对象
  4. 具体装饰类都装饰了read()方法

(2)OutputStream:

OutputStream的设计类似于inputStream:

  1. OutputStream抽象类中有抽象方法write(int)
  2. FilterOutputStream中有引用OutputStream用于存放被装饰的类
  3. 其继承类都装饰了write(int)方法

4、其他应用

Swing包中图形界面构件功能

Struts2中,request,response,session对象的处理

网站文章

  • JVM内存布局

    JVM内存布局

    Survivor区分为S0和S1两块内存空间,每次YGC时,它们将存活的对象复制到未使用的那块空间,然后将当前正在使用的空间完全清除,交换两块空间的使用状态。当大量本地方法出现时,势必会削弱JVM对系...

    2024-01-30 20:29:22
  • css固定定位

    css固定定位

    主要使用场景:可以在浏览器页面滚动元素时元素的位置不会改变。1、以浏览器的可视窗口作为参考点移动元素。4、不占有固定位置,浮起来了。3、不随滚动条的滚动而变化。2、和父元素没有关系。

    2024-01-30 20:28:51
  • 使用jQuery的ajax上传文件报错:Uncaught TypeError: Illegal invocation

    使用ajax上传文件,代码如下:$('#video-upload-btn').on('change', function(){ var file = this.files[0]; var data =...

    2024-01-30 20:28:44
  • Java代码审计之RCE(远程命令执行)

    Java代码审计之RCE(远程命令执行)

    Java代码审计系列课程(点我哦)漏洞原理:RCE漏洞,可让攻击者直接向后台服务器远程注入操做系统命令或者代码,从而控制后台系统。出现此类漏洞通常由于应用系统从设计上须要给用户提供指定的远程命令操做的...

    2024-01-30 20:28:37
  • Android面试题集-常见几个面试题详解

    Android面试题集-常见几个面试题详解

    跳槽,这在 IT 互联网圈是非常普遍的,也是让自己升职加薪,走上人生巅峰的重要方式。那么作为一个普通的Android程序猿,我们如何才能斩获大厂offer 呢? 疫情向好、面试在即,还在迷茫踌躇中的后...

    2024-01-30 20:28:06
  • 使用EasyExcel实现上传解析与导出下载

    使用EasyExcel实现上传解析与导出下载

    使用指南:https://www.yuque.com/easyexcel/doc/easyexcel 环境:jdk1.8、SpringBoot 2.2.2 准备工作: pom.xml 添加依赖jar包...

    2024-01-30 20:27:57
  • AF_INET 和PF_INET区别;AF_LOCAL PF_LOCAL 区别.

    从字面理解: AF_INET = Address Format, Internet = IP Addresses PF_INET = Packet Format, Internet = IP, TCP/IP or UDP 从linux的定义来看,两者无区别。 /* Supported address families. */#define AF_UNSPEC 0#define AF_UNI...

    2024-01-30 20:27:55
  • springboot和vue前后端分离部署微信公众号

    网上已经有很多vue打包后放到resources目录的解决方案,也有vue前台微信插件然后请求后台方案,我就不Ctrl+C加Ctrl+V了。说说我的分离部署的解决方案:nginx反响代理后台路径,后端验证通过后跳转前端路径通过response.sendRedirect("前台的路径"),如/api,原来http://localhost:8080/user/login,变成http://xx...

    2024-01-30 20:27:49
  • 负数在计算机中怎样存储

    负数在计算机中怎样存储

    一、什么是原码、反码、补码?分为:正数 和负数(包括正浮点数,和负浮点数)规定最高位位符号位正数为0,负数为1(原因下文解释)原码:10进制转换成2进制是原码,只不过正数的原码是本身符号位为0,负数的原码符号位为1(以下篇幅均以单字节为例:10进制1的原码是0000 0001,10进制-1的原码是1000 0001)。反码: 正数的反码是本身,负数的反码是负数的原码0变为1,1变为0 &...

    2024-01-30 20:27:16
  • php create_function()产生的漏洞

    create_function(‘参数’,’函数体’):官方example:

    2024-01-30 20:27:10