用java触发器的实现松耦合
程序员文章站
2022-06-17 19:31:54
...
1、解决的问题:一个客户,有多个销售记录,有多个合同记录,有多个服务记录,有多个......,在这种结构,为了实现松耦合,销售记录、合同记录中,只记录下客户的id和name(以方便展示),但:当一个客户名称更新时,所有和它相关的数据如何同步更新。有一种方法,就是将客户更新的地方写代码更新和它相关的数据,但这样对紧紧耦合在一起。第二种方法,手动写一个类似触发器的东西来实现。
2、bo类结构展示
客户类:
客户销售记录类
客户合同记录类
3、客户更新触发器接口的定义
4、销售记录对触发器的实现
5、合同记录对触发器的实现
6、在客户更新处的代码
如此,便可用实现TriggerClientUpdateInf来实现构耦合。(1)在客户更新处,会将所有放入list中的实现TriggerClientUpdateInf接口的对象的afterClientUpdate方法执行一遍。谁放的,放的什么,我不关心,我只认这个接口,执行一扁即可。(2)其它关心客户更新的模块,如销售记录,只需要实现接口,并将一个实例放入list中即可!
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中即可!
推荐阅读
-
Java怎么用几行代码实现简单的网络象棋游戏
-
简单的用java实现读/写文本文件的示例
-
用mysql触发器自动更新memcache的实现代码
-
android用java和c实现查找sd卡挂载路径(sd卡路径)的方法
-
java用两个栈实现队列的push和pop
-
用Java实现简单的区块链
-
用Java编程输出万年历的功能实现
-
【JAVA】用Comparable接口学生的成绩做降序排序!请正确指定泛型;用Comparator实现按照姓名排序,请正确指定泛型!
-
用Java的Set实现交并差等集合运算
-
【贪吃蛇—Java程序员写Android游戏】系列 3. 用J2ME实现Android的Snake Sample详解 Android游戏JavaUI多线程