一、介绍
装饰设计模式:在不必改变源代码基础上,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是包裹真实的对象。就是对已有对象进行功能增强!举一个简单的例子,你个车子,进入修车厂,换上了玛莎拉蒂的发动机,车子还是这个车子,但是功能变强大了
二、装饰者模式的缺陷
1):确实可以这个解决问题.
2):会暴露真实对象--不安全.
3):需要为每一个需要增强的类定义一个包装类.
三、代码示例
@Setter
@Getter
public class Employee {
private Long id;
private String name;
}
public interface IEmployeeService {
void save(Employee e);
void update(Employee e);
}
@Service("target")
public class EmployeeServiceImpl implements IEmployeeService{
@Autowired
private IEmployeeDao employeeDao ;
@Override
public void save(Employee e) {
employeeDao.save(e);
}
@Override
public void update(Employee e) {
employeeDao.update(e);
}
}
事物管理器:
@Component("txManager")
public class TransactionManager {
public void begin(){
System.out.println("事物开启。。。。。");
}
public void commit(){
System.out.println("事物提交。。。。。");
}
public void rollback(){
System.out.println("事物回滚。。。。。");
}
}
包装类:
/**
* EmployeeServiceImpl包装类,对service方法增强事物管理操作
*/
@SuppressWarnings("all")
public class EmployeeServiceImplWapper implements IEmployeeService {
// 包含的真实对象
// private EmployeeServiceImpl target;
// 用接口,面向接口编程
private IEmployeeService target;
// 事物管理器
private TransactionManager txManager;
public EmployeeServiceImplWapper(IEmployeeService target, TransactionManager txManager) {
this.target = target;
this.txManager = txManager;
}
@Override
public void save(Employee e) {
txManager.begin();
try {
target.save(e);
txManager.commit();
} catch (Exception e1) {
txManager.rollback();
e1.printStackTrace();
}
}
@Override
public void update(Employee e) {
txManager.begin();
try {
target.update(e);
txManager.commit();
} catch (Exception e1) {
txManager.rollback();
e1.printStackTrace();
}
}
}
测试类:
public class EmployeeWapperTest {
@Test
public void testSave(){
EmployeeServiceImplWapper esiw = new EmployeeServiceImplWapper(
new EmployeeServiceImpl(), // 真实的对象
new TransactionManager()); // 事物管理器
esiw.save(new Employee());
}
}