享元模式
定义:运用共享技术来有効地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量
相似类的开销,从而提高系统资源的利用率。
public abstract class Log {
/*
* 内部状态(类似于数据库主键,不会发生频繁变更)
* 同一线程中,记录日志时,用户名字、用户性别、用户角色
*/
//用户名字
private String username;
//用户性别
private String sex;
//用户角色
private String role;
/*
* 外部状态(类似于不同数据,频繁迭代,快速递增)
* 同一个线程中,记录日志时,每次访问的不同方法和参数不一样
*/
//操作方法
private String methodName;
//信息
private String message;
/*
* 业务操作,补充和完善methodName,args参数
*/
public abstract void supplementLogContent(String... args);
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Log(String username, String sex, String role) {
this.username = username;
this.sex = sex;
this.role = role;
}
@Override
public String toString() {
return "Log{" + "username='" + username + '\'' + ", sex='" + sex + '\'' + ", role='" + role + '\'' + ", methodName='" + methodName + '\'' + ", message='" + message + '\'' + '}';
}
}
public class SpecificOperationLog extends Log{
/****
* 业务逻辑,完善不同方法的日志记录
* @param args 长度为2,第1个是方法名字,第2个是方日志信息
*/
@Override
public void supplementLogContent(String... args) {
super.setMethodName(args[0]);
super.setMessage(args[1]);
}
public SpecificOperationLog(String username, String sex, String role) {
super(username, sex, role);
}
}
public class ThreadUserLogFactory {
/*
* ThreadLocal的作用
* 线程私有,线程安全
* 允许一个线程以及该线程创建所有线程可以访问已经保存的值
*
* */
//存储线程对应的用户名日志信息
private static ThreadLocal<Log> userRecode = new ThreadLocal<>();
/****
* 添加用户信息记录
*/
public void add(Log log) {
userRecode.set(log);
}
/***
* 记录方法名和参数
* @param args
*/
public String reload(String... args) {
//获取对象
Log logComponent = userRecode.get();
//设置数据
logComponent.supplementLogContent(args);
System.out.println("logComponent:"+logComponent.toString());
return logComponent.toString();
}
/****
* 获取LogComponent
*/
public Log get(){
return userRecode.get();
}
/****
* 移除
*/
public void remove(){
userRecode.remove();
}
}
public class OperationDemo {
public static void main(String[] args) {
/*
* 模拟controller访问,前端传过来的用户信息
* 第一个ThreadLocal变量线程保存一个值
* */
ThreadUserLogFactory userLogFactory=new ThreadUserLogFactory();
Log log = new SpecificOperationLog("Tom", "男", "cat");
userLogFactory.add(log);
/*
* 模拟AOP切面调用方法,记录日志
* 第二个ThreadLocal变量线程在第一个变量线程ThreadLocal基础上继续操作,
* 存放对应的值
* */
ThreadUserLogFactory userLogFactory2=new ThreadUserLogFactory();
userLogFactory2.reload("com.hikktn.flyweight.service.impl.addUser","name:Tom","sex:男","role:cat");
}
}