`

用java触发器的实现松耦合

    博客分类:
  • java
阅读更多
1、解决的问题:一个客户,有多个销售记录,有多个合同记录,有多个服务记录,有多个......,在这种结构,为了实现松耦合,销售记录、合同记录中,只记录下客户的id和name(以方便展示),但:当一个客户名称更新时,所有和它相关的数据如何同步更新。有一种方法,就是将客户更新的地方写代码更新和它相关的数据,但这样对紧紧耦合在一起。第二种方法,手动写一个类似触发器的东西来实现。
2、bo类结构展示
客户类:
public class Client
{
	@Id
	@GeneratedValue(generator = "uuidGenerator")
	@GenericGenerator(name = "uuidGenerator", strategy = "uuid")
	@Column(length = 32)
	private String id;//标识

	@Column(length = 10)
	private String code; //编号

	@Column(length = 50)
	private String name; //名称

          //其他省略
}



客户销售记录类
public class Sell
{
	@Id
	@GeneratedValue(generator = "uuidGenerator")
	@GenericGenerator(name = "uuidGenerator", strategy = "uuid")
	@Column(length = 32)
	private String id;//标识

	@Column
	private double price;//单价

	@Column
	private double amount;//数量

	@Column
	private double money;//金额

	@Column(length = 32)
	private String clientId; //客户ID

	@Column(length = 50)
	private String clientName; //客户名称

          //其他省略
}


客户合同记录类
public class Contract
{
	@Id
	@GeneratedValue(generator = "uuidGenerator")
	@GenericGenerator(name = "uuidGenerator", strategy = "uuid")
	@Column(length = 32)
	private String id;//标识

	@Column(length = 20)
	private String code; //合同编码
	
	@Column(length = 50)
	private String name; //合同名称
	
	@Column(length = 32)
	private String clientId; //客户ID

	@Column(length = 50)
	private String clientName; //客户名称

          //其他省略

}


3、客户更新触发器接口的定义
public interface TriggerClientUpdateInf
{
	List<TriggerClientUpdateInf> ls=new ArrayList<TriggerClientUpdateInf>(); //存放所有实现该接口的类对象
	
	/**
	 * 功能描述:客户信息更新后触发
	 *</br>日期:2012-4-16
	 *</br>@author : 劲风
	 *</br>@param dao 数据库操作类
	 *</br>@param dto 客户DTO,主要传入要更新客户的id和更新后的名称
	 */
	public void afterClientUpdate(Dao dao,ClientDto dto);
}


4、销售记录对触发器的实现
@org.springframework.stereotype.Service //为了让spring将该类管理,以便将类载入内存,以便执行static中的语句
public class TriggerClientUpdateSell implements TriggerClientUpdateInf
{
	
    @Override
    public void afterClientUpdate(Dao dao, ClientDto dto)
    {
       String hql="update Sell t set t.clientName='"+dto.getName+"' where t.clientId='"+dto.getId+"'";
       dao.updateByHql(hql);
    }
	
    static 
    {
       TriggerClientDeleteInf.ls.add(new TriggerClientUpdateSell());
    }
}


5、合同记录对触发器的实现
@org.springframework.stereotype.Service //为了让spring将该类管理,以便将类载入内存,以便执行static中的语句
public class TriggerClientUpdateContract implements TriggerClientUpdateInf
{
	
    @Override
    public void afterClientUpdate(Dao dao, ClientDto dto)
    {
       String hql="update Contractt set t.clientName='"+dto.getName+"' where t.clientId='"+dto.getId+"'";
       dao.updateByHql(hql);
    }
	
    static 
    {
       TriggerClientDeleteInf.ls.add(new TriggerClientUpdateContract());
    }
}


6、在客户更新处的代码
...
List<TriggerClientUpdateInf> ls =TriggerClientUpdateInf.ls;
for(TriggerClientUpdateInf tr:ls)
{
   tr.afterClientUpdate(dao,clientDto); //
}
...


如此,便可用实现TriggerClientUpdateInf来实现构耦合。(1)在客户更新处,会将所有放入list中的实现TriggerClientUpdateInf接口的对象的afterClientUpdate方法执行一遍。谁放的,放的什么,我不关心,我只认这个接口,执行一扁即可。(2)其它关心客户更新的模块,如销售记录,只需要实现接口,并将一个实例放入list中即可!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics