java设计模式-观察者模式

java设计模式-观察者模式

1.观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

介绍
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

**主要解决:**一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

**何时使用:**一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

如何解决:使用面向对象技术,可以将这种依赖关系弱化。

**关键代码:**在抽象类里有一个 ArrayList 存放观察者们。

使用场景:

一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
一个对象必须通知其他对象,而并不知道这些对象是谁。
需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
注意事项: 1、JAVA 中已经有了对观察者模式的支持类。 2、避免循环引用。 3、如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。

2.使用spring提供的ApplicationEvent来实现。(简介)ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式,设计初衷也是为了系统业务逻辑之间的解耦,提高可扩展性以及可维护性。事件发布者并不需要考虑谁去监听,监听具体的实现内容是什么,发布者的工作只是为了发布事件而已。

话不多说直接上代码。

  1. 注册一个用户注册事件
/**
 1. 用户注册事件
 */
public class UserRegisterEvent extends ApplicationEvent{
	private String name;
	
	public UserRegisterEvent(Object source) {
		super(source);
	}

	public UserRegisterEvent(Object source, String name) {
		super(source);
		this.name = name;
	}

	public String getName() {
		return name;
	}
}
  1. 当用户执行注册的时候使用ApplicationEventPublisherAware发布事件
@Service
public class UserServiceImpl implements UserService,ApplicationEventPublisherAware {
	private static Logger logger=LoggerFactory.getLogger(UserServiceImpl.class);
	
	private ApplicationEventPublisher applicationEventPublisher;
	
	@Override
	public void register(String userName) {
		System.out.println("123213");
		logger.debug("----------------开始执行{}用户注册触发监听事件----------------------",userName);
		applicationEventPublisher.publishEvent(new UserRegisterEvent(this, userName));
	}

	@Override
	public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
		this.applicationEventPublisher=applicationEventPublisher;
	}

}

3.设置观察者实现监听事件是否发布 使用ApplicationListener

@Service
public class EmailServiceImpl implements EmailService,ApplicationListener<UserRegisterEvent> {
	@Autowired 
	private SendEmailTask sendEmailTask;
	
	@Override
	@Async
	public void sendEmail(UserRegisterEvent event) {
		UserServiceImpl uServiceImpl= (UserServiceImpl) event.getSource();
		//sendEmailTask.sendEmail();
	}

	@Override
	public void onApplicationEvent(UserRegisterEvent event) {
		// TODO Auto-generated method stub
		//当事件发布时调用发送邮件的方法
		this.sendEmail(event);
	}
}

4.测试调用

@RestController
@RequestMapping("user")
public class UserRegisterController {
	@Resource
	private UserService userService;
	
	@RequestMapping("/q")
	public String doRegister(String name) {
		User user =User.builder().name("zzy").age(26).build();
		userService.register(name);
		return "成功";
	}
}

5.输出结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值