深入解析Java观察者设计模式:定义、结构与优缺点全面解析

Java设计模式:观察者模式1。观察者模式1.1定义

深入解析Java观察者设计模式:定义、结构与优缺点全面解析

观察者模式的定义:指多个对象之间存在一对多依赖关系。当对象的状态更改时,所有依赖于其的对象都会通知并自动更新。该模式有时称为发布订阅模式和模型视图模式,该模式是对象行为模式。

观察者模式是对象行为模式,其主要优点如下:

目标与观察者之间的耦合关系减少了,两者是抽象的耦合关系。

目标和观察者之间建立了一组触发机制。

它的主要缺点如下:

目标与观察者之间的依赖性并非完全断开,并且可能存在循环引用。

当有许多观察者时,通知会议需要大量时间,这会影响该计划的效率。

1.2模式结构和特定

观察者模式的主要字符如下:

抽象主题角色:也称为抽象目标类,它提供了一个用于保存观察者对象的聚合类,以及一种添加和删除观察者对象的方法,以及一种摘要方法来通知所有观察者。

具体主题角色:也称为具体目标类别,它在抽象目标中实现了通知方法。当特定主题的内部状态更改时,所有已注册的观察者对象都会通知。

摘要观察者角色:它是一个抽象类或接口,包含一种抽象方法,该方法会自行更新自身,并在收到特定主题的更改通知时被称为。

具体观察者角色:实现抽象观察者在收到有关目标更改的通知时更新自己的状态的抽象方法。

1.3问题的起源

在现实世界中,许多对象并不独立存在,改变一个对象的行为也可能导致改变一个或多个其他对象的行为。例如,当某些商品的价格上涨时,一些企业会很高兴,消费者会感到悲伤;当我们开车到十字路口时,我们会在遇到红灯时停止,当我们遇到绿灯时,我们将运行。有许多这样的例子,例如股票价格和股东,微信官方帐户和微信用户。

1.4解决方案

它要意识到,当多个对象之间存在一对多依赖关系时,当对象的状态更改时,所有依赖于其的对象都会被通知并自动更新。通过接口,可以直接调用特定目标对象和特定观察者对象,并且可以实现观察模式。

/**
 * @author tbb
 *     公众号
 */
public abstract class OfficialAccount 
{
	protected List<WeixinUser> userList = new ArrayList<WeixinUser>();
	public void addUser(WeixinUser weixinUser) 
	{
		userList.add(weixinUser);
	}
    public abstract void sendMessage(String message);
}

/**
 * @author tbb
 *     微信公众号
 */
public class WeixinOfficialAccount extends OfficialAccount
{
  
	@Override
	public void sendMessage(String message) 
	{
		for (WeixinUser user : userList)
		{
			user.receiveMessage(message);
		}
	}
}


public interface WeixinUser 
{
    public void receiveMessage(String message);
    public void showMessage();
}

public class ZhangSanUser implements WeixinUser{
	private String message;
	@Override
	public void receiveMessage(String message) 
	{
		this.message = message;
	}
	@Override
	public void showMessage() 
	{
		System.out.println(message);
	}
}

public class Test 
{
    public static void main(String[] args) 
    {
    	WeixinOfficialAccount wxgzh = new WeixinOfficialAccount();
    	ZhangSanUser zs = new ZhangSanUser();
    	wxgzh.addUser(zs);
    	wxgzh.sendMessage("111");
    	zs.showMessage();
    }
}

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

26阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

26阅读