Spring 装饰者模式

一、介绍

        装饰设计模式:在不必改变源代码基础上,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是包裹真实的对象。就是对已有对象进行功能增强!举一个简单的例子,你个车子,进入修车厂,换上了玛莎拉蒂的发动机,车子还是这个车子,但是功能变强大了

二、装饰者模式的缺陷

   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());
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值