关于过滤器的一个例子(涉及到装饰模式)

全站压缩问题的GZIP过滤器实现
本文介绍了一个解决全站压缩问题的GZIP过滤器实现过程,包括类继承、构造函数定义、方法覆盖及GZIP压缩操作。
Decorator设计模式的实现
1.首先看需要被增强对象继承了什么接口或父类,编写一个类也去继承这些接口或父类。
2.在类中定义一个变量,变量类型即需增强对象的类型。
3.在类中定义一个构造函数,接收需增强的对象。
4.覆盖需增强的方法,编写增强的代码。

下面是一个解决全站压缩问题的一个过滤器,关于过滤器的执行过程我就不多说了。
package com.why.web.filter;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.zip.GZIPOutputStream;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

import com.sun.org.apache.bcel.internal.generic.NEW;


//解决全站压缩问题
public class GzipFilter implements Filter {

	public void init(FilterConfig filterConfig) throws ServletException {
		

	}

	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		
		HttpServletRequest request = (HttpServletRequest)req;
		HttpServletResponse response = (HttpServletResponse)resp;
		
		BufferResponse myresponse = new BufferResponse(response);
		
		chain.doFilter(request, myresponse);
		
		
		//拿出缓存中的数据,压缩后再打给浏览器
		byte[] bytes = myresponse.getBuffer();
		
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		GZIPOutputStream gzip = new GZIPOutputStream(bout);
		gzip.write(bytes);
		gzip.close();
		
		
		
		byte[] gzipbyte = bout.toByteArray();
		
		
		response.setHeader("content-encoding", "gzip");
		response.setContentLength(gzipbyte.length);
		response.getOutputStream().write(gzipbyte);
		
	}

	public void destroy() {
		

	}
}

class BufferResponse extends HttpServletResponseWrapper{
	
	private HttpServletResponse response;
	private ByteArrayOutputStream bout = new ByteArrayOutputStream();
	private PrintWriter pw;

	public BufferResponse(HttpServletResponse response) {
		super(response);
		this.response = response;
	}

	@Override
	public ServletOutputStream getOutputStream() throws IOException {
		
		return new MyServletOutputStream(bout);
	}

	@Override
	public PrintWriter getWriter() throws IOException {
		
		pw = new PrintWriter(new OutputStreamWriter(bout,response.getCharacterEncoding()));
		//pw = new PrintWriter(bout);
		return pw;
	}
	
	public byte[] getBuffer(){
		try {
			
			if(pw != null){
				pw.close();
			}
			
			if(bout != null){
				bout.flush();
				return bout.toByteArray();
			}
			return null;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
}

class MyServletOutputStream extends ServletOutputStream{

	private ByteArrayOutputStream bout;
	
	
	public MyServletOutputStream(ByteArrayOutputStream bout) {
		super();
		this.bout = bout;
	}

	@Override
	public void write(int b) throws IOException {
		
		this.bout.write(b);
		
	}
	
}


【最优潮流】直流最优潮流(OPF)课设(Matlab代码实现)内容概要:本文档主要围绕“直流最优潮流(OPF)课设”的Matlab代码实现展开,属于电力系统优化领域的教学与科研实践内容。文档介绍了通过Matlab进行电力系统最优潮流计算的基本原理与编程实现方法,重点聚焦于直流最优潮流模型的构建与求解过程,适用于课程设计或科研入门实践。文中提及使用YALMIP等优化工具包进行建模,并提供了相关资源下载链接,便于读者复现与学习。此外,文档还列举了大量与电力系统、智能优化算法、机器学习、路径规划等相关的Matlab仿真案例,体现出其服务于科研仿真辅导的综合性平台性质。; 适合人群:电气工程、自动化、电力系统及相关专业的本科生、研究生,以及从事电力系统优化、智能算法应用研究的科研人员。; 使用场景及目标:①掌握直流最优潮流的基本原理与Matlab实现方法;②完成课程设计或科研项目中的电力系统优化任务;③借助提供的丰富案例资源,拓展在智能优化、状态估计、微电网调度等方向的研究思路与技术手段。; 阅读建议:建议读者结合文档中提供的网盘资源,下载完整代码与工具包,边学习理论边动手实践。重点关注YALMIP工具的使用方法,并通过复现文中提到的多个案例,加深对电力系统优化问题建模与求解的理解。
<think>好的,我现在要解决用户的问题,他想用纯Java代码实现Spring Boot中涉及的设计模式示例。首先,我需要回顾一下用户提供的引用内容,看看有哪些设计模式被提到过。引用中提到了单例模式、策略模式、责任链模式,还有通过注解实现的AOP,可能涉及代理模式或装饰器模式。用户希望的是纯Java代码,不需要依赖Spring Boot的注解或框架特性,所以需要将这些设计模式用基础的Java来实现,同时保持Spring Boot中的使用场景。 首先,单例模式。在Spring Boot中,Bean默认是单例的,所以需要用Java实现单例。常见的单例实现方式有饿汉式、懒汉式、双重检查锁、静态内部类等。考虑到线程安全,静态内部类方式比较推荐。然后需要结合一个场景,比如数据库连接池,但这里可能需要简化,比如一个配置类。 然后是策略模式。引用中提到策略模式在Spring Boot中的应用,比如不同的支付方式。用纯Java的话,需要定义策略接口,然后不同的实现类,再有一个上下文类来选择策略。比如订单处理,根据不同用户类型使用不同折扣策略。 责任链模式在引用里提到用自定义注解和AOP实现,但用户需要纯Java。责任链模式通常涉及处理器链,每个处理器决定是否处理请求或传递给下一个。例如用户权限校验链,比如日志记录、权限检查、数据验证等步骤。 还有工厂模式,可能在配置属性类中提到,比如MqttProperties的创建。工厂模式可以通过一个工厂类来创建对象,隐藏具体实现。比如创建不同的数据库连接对象。 代理模式在AOP中应用,比如前置通知。用Java动态代理或静态代理来实现,比如记录方法执行时间。 现在需要将这些模式用纯Java代码示例展示,每个模式一个例子,并说明在Spring Boot中的对应场景。需要注意代码简洁,符合Java标准,不使用Spring特定注解。 接下来要检查每个模式的实现是否正确,是否符合用户需求。比如单例模式是否线程安全,策略模式是否有上下文类,责任链模式是否形成链式调用,工厂模式是否返回合适对象,代理模式是否使用动态代理等。 可能需要调整代码示例,确保没有依赖Spring框架,同时又能体现设计模式在Spring Boot中的应用场景。例如,单例模式对应Spring的Bean单例管理,策略模式对应不同的业务实现,责任链模式对应拦截器链或过滤器链,工厂模式对应Bean的创建,代理模式对应AOP的实现。 最后,生成相关问题,确保问题与设计模式及其实现相关,帮助用户进一步理解。</think>以下是通过纯Java代码实现Spring Boot中常用设计模式的示例,每种模式均对应Spring Boot中的典型应用场景: ### 一、单例模式(对应Spring Bean单例管理) ```java // 静态内部类实现(线程安全) public class AppConfig { private static class Holder { private static final AppConfig INSTANCE = new AppConfig(); } private String env = "prod"; private AppConfig() {} // 私有构造函数 public static AppConfig getInstance() { return Holder.INSTANCE; } public String getEnv() { return env; } } // 使用示例 AppConfig config = AppConfig.getInstance(); System.out.println("Current environment: " + config.getEnv()); ``` *对应场景*:Spring默认单例Bean管理,如配置类实例[^2] ### 二、策略模式(对应支付/订单处理等场景) ```java // 策略接口 interface DiscountStrategy { double applyDiscount(double amount); } // 具体策略 class VipDiscount implements DiscountStrategy { public double applyDiscount(double amount) { return amount * 0.8; } } class NormalDiscount implements DiscountStrategy { public double applyDiscount(double amount) { return amount * 0.95; } } // 上下文类 class OrderService { private DiscountStrategy strategy; public void setStrategy(DiscountStrategy strategy) { this.strategy = strategy; } public double calculateTotal(double amount) { return strategy.applyDiscount(amount); } } // 使用示例 OrderService service = new OrderService(); service.setStrategy(new VipDiscount()); System.out.println("VIP price: " + service.calculateTotal(100)); ``` *对应场景*:多种支付方式/优惠策略的实现[^3] ### 三、责任链模式(对应拦截器链) ```java abstract class Handler { protected Handler next; public Handler setNext(Handler next) { this.next = next; return next; } public abstract void handleRequest(String request); } class AuthHandler extends Handler { public void handleRequest(String request) { if (request.contains("auth=success")) { System.out.println("Authentication passed"); if (next != null) next.handleRequest(request); } else { System.out.println("Authentication failed"); } } } class LogHandler extends Handler { public void handleRequest(String request) { System.out.println("Logging request: " + request); if (next != null) next.handleRequest(request); } } // 构建责任链 Handler chain = new AuthHandler(); chain.setNext(new LogHandler()); // 使用示例 chain.handleRequest("GET /api/data?auth=success"); ``` *对应场景*:请求处理链路(认证->日志->业务处理)[^5] ### 四、工厂模式(对应Bean创建) ```java interface Connection { void connect(); } class MySQLConnection implements Connection { public void connect() { System.out.println("MySQL connected"); } } class RedisConnection implements Connection { public void connect() { System.out.println("Redis connected"); } } class ConnectionFactory { public static Connection getConnection(String type) { switch(type.toLowerCase()) { case "mysql": return new MySQLConnection(); case "redis": return new RedisConnection(); default: throw new IllegalArgumentException("Invalid type"); } } } // 使用示例 Connection conn = ConnectionFactory.getConnection("mysql"); conn.connect(); ``` *对应场景*:不同数据源连接的创建管理[^4] ### 五、代理模式(对应AOP实现) ```java interface UserService { void saveUser(); } class UserServiceImpl implements UserService { public void saveUser() { System.out.println("Saving user..."); } } class LoggingProxy implements UserService { private UserService target; public LoggingProxy(UserService target) { this.target = target; } public void saveUser() { System.out.println("[LOG] Method start"); target.saveUser(); System.out.println("[LOG] Method end"); } } // 使用示例 UserService service = new LoggingProxy(new UserServiceImpl()); service.saveUser(); ``` *对应场景*:日志记录、性能监控等横切关注点[^5]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值