设计模式-装饰模式
- 装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活
实体类
package com.zjstart.decorator;
import lombok.Builder;
@Builder
public class User {
private String name;
private String sex;
public User() {
}
public User(String name, String sex) {
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
抽象类或者接口
- 定义我们最核心的对象,也就是最原始的对象。
package com.zjstart.decorator;
public interface UserDao {
boolean saveUser(User user);
}
抽象类或者接口实现类
- 具体构件,通过继承实现UserDao抽象类中的抽象方法。
- 是最核心、最原始、最基本的接口或抽象类的实现,我们要装饰的就是它。
package com.zjstart.decorator;
import java.util.ArrayList;
import java.util.List;
public class UserDaoImpl implements UserDao{
List<User> list = new ArrayList<>();
@Override
public boolean saveUser(User user) {
return list.add(user);
}
}
装饰类
- 一般是一个抽象类,在其属性里必然有一个private变量指向UserDao抽象构件。
- 获取添加用户时的时间
- 获取添加用户时的参数
- 获取添加用户的返回值(boolean)
package com.zjstart.decorator;
import java.time.LocalDateTime;
public class UserDaoLog implements UserDao{
//维护一个真实的操作类
private UserDao userDao;
private User user;
private LocalDateTime time;
public UserDaoLog(UserDao userDao){
this.userDao = userDao;
}
@Override
public boolean saveUser(User user) {
//获取添加的用户
System.out.println(user);
//获取添加用户时的返回值
return userDao.saveUser(user);
}
public LocalDateTime getTime(){
//获取添加用户时的时间
time = LocalDateTime.now();
return time;
}
}
测试类
package com.zjstart.decorator;
public class UserDaoLogTest {
public static void main(String[] args) {
UserDaoLog udl = new UserDaoLog(new UserDaoImpl());
User user = new User("张三","男");
System.out.println(udl.saveUser(user));
System.out.println(udl.getTime());
}
}
测试结果
User{name=‘张三’, sex=‘男’}
true
2021-12-14T16:56:50.787423800