`
o_o_0
  • 浏览: 17714 次
  • 性别: Icon_minigender_1
  • 来自: 济南
文章分类
社区版块
存档分类
最新评论

组合模式 实现 观察者模式

 
阅读更多
public class Watched
{
	Watcher watcherList;


	public synchronized void addWatcher(Watcher w)
	{
		if (w == null)
		{
			return;
		}
		
		watcherList =WatcherMultiCaster.add(watcherList,w);
	}
	
	public synchronized void removeWatcher(Watcher s) {
		if (s == null) {
		    return;
		}
		watcherList = WatcherMultiCaster.remove(watcherList, s);
	    }
	
	
	public void processAction(String msg){
		Watcher w = watcherList;
		if(w!=null){
			w.action(msg);
		}
	}
}
//---------------------------------------------------------------------------------------------------------
public interface Watcher //观察者接口
{
	public void action(String msg);
}

//---------------------------------------------------------------------------------------------------------

public class WatcherMultiCaster implements Watcher  //铸造器
{
	protected final Object a,b;
	
	protected WatcherMultiCaster(Object a,Object b){
		this.a = a;
		this.b = b;
	}
	
	public static Watcher add(Watcher a,Watcher b){
		return  (Watcher) addInternal(a,b);
	}
	
	public static Watcher remove(Watcher w,Watcher oldw){
		return (Watcher)removeInternal(w,oldw);
	}
		
	
	
	
	protected static Object addInternal(Object a,Object b){
		if (a == null)  return b;
		if (b == null)  return a;
		return new WatcherMultiCaster(a, b);
	}
	
	
	protected static Object removeInternal(Object w, Object oldw)
	{
		if (w == oldw || w == null) {
		    return null;
		} else if (w instanceof WatcherMultiCaster) {
		    return ((WatcherMultiCaster)w).remove(oldw);
		} else {
		    return w;		
		}
	}

	private Object remove(Object oldw)
	{
		if (oldw == a)  return b;
		if (oldw == b)  return a;
		
		Object a2 = removeInternal(a, oldw);
		Object b2 = removeInternal(b, oldw);
		if (a2 == a && b2 == b) {
		    return this;
		}
		return addInternal(a2, b2);
	}
	

	@Override
	public void action(String msg)
	{
		((Watcher)a).action(msg);
		((Watcher)b).action(msg);
	}

}


//---------------------------------------------------------------------------------------------------------

public class WatcherA implements Watcher
{

	@Override
	public void action(String msg)
	{
		System.out.println("WatcherA recived:"+msg);
	}

}


public class WatcherB implements Watcher
{

	@Override
	public void action(String msg)
	{
		System.out.println("WatcherB recived: "+msg);
	}

}


public class WatcherC implements Watcher
{

	@Override
	public void action(String msg)
	{
		System.out.println("WatcherC recived:"+msg);
	}

}
//---------------------------------------------------------------------------------------------------------

public class ObserverTest
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		Watched watched = new Watched();
		
		WatcherA wa = new WatcherA();
		WatcherB wb = new WatcherB();
		WatcherC wc = new WatcherC();
		
		watched.addWatcher(wa);
		watched.addWatcher(wb);
		watched.addWatcher(wc);
		
		watched.processAction("Stand up!");
		
		watched.removeWatcher(wb);
		
		watched.processAction("Sit down");
		
		watched.addWatcher(new WatcherC());
		
		watched.processAction("Sing!");

	}

}









分享到:
评论

相关推荐

    java实验策略模式观察者模式和组合模式.doc

    在本实验中,我们使用观察者模式实现了一个学校公布信息系统。我们定义了一个主题接口 `Notice`,它提供了发布信息的方法。然后,我们定义了三个观察者类:`Student`、`Teacher` 和 `Administrator`。每个观察者类都...

    java实验策略模式观察者模式和组合模式.pdf

    在本实验中,我们将使用观察者模式实现学校发布信息的功能,学生、老师和行政人员可以订阅学校发布的信息,并在信息变化时得到通知。 在观察者模式中,我们定义了一个主题接口 Notice 和观察者接口 Observer,...

    Java观察者模式案例

    在Java中,观察者模式的实现基于Java.util.Observable和Java.util.Observer接口。 Java的观察者模式通常包含两个主要角色: 1. **主题(Subject)**:这是被观察的对象,它可以是具体的类或抽象类。主题维护了一个...

    观察者模式(包含简单代码)

    在实际应用中,观察者模式可以与其他设计模式结合,如组合模式来处理树形结构的观察者,或者策略模式来实现不同的处理策略。此外,Java和.NET等现代编程语言提供了内置的事件和委托机制,简化了观察者模式的实现,但...

    python 项目里常用的设计模式 组合模式 策略模式 抽象工厂 代理模式 工厂模式 观察者模式 简单工厂 建造者模式 模板模式

    python 项目里常用的设计模式 单例模式 组合模式 策略模式 抽象工厂 代理模式 工厂模式 观察者模式简单工厂 建造者模式 模板模式 桥接多维度 桥接模式 适配器模式 外观模式 享元模式 责任链组合模式

    java实验策略规划模式、观察者模式和组合模式.pdf

    Java实验中的策略模式、观察者模式和组合模式是软件设计中常见的面向对象设计模式,它们在实际开发中具有广泛的应用。下面将详细解释这三个模式及其在实验中的具体应用。 1. **策略模式**: 策略模式是一种行为...

    java实验:策略模式、观察者模式和组合模式.doc

    【Java 实验:策略模式、观察者模式和组合模式】 实验目标主要集中在理解和应用三种设计模式:策略模式、观察者模式和组合模式。这三种模式是面向对象设计中常用且重要的设计模式,它们有助于提高代码的灵活性、可...

    专题资料(2021-2022年)java实验策略模式、观察者模式和组合模式.doc

    实验要求使用策略模式、观察者模式和组合模式来实现一个二维数组的数据显示和编辑。当用户在用户界面上移动滑块改变数组值时,饼状图和柱状图会根据二维数组每一维的总和实时更新。 实验环境主要包括PC微机、DOS或...

    java实验策略模式、观察者模式和组合模式.docx

    ### Java实验策略模式、观察者模式和组合模式详解 ...通过以上分析,我们可以清晰地了解到策略模式、观察者模式和组合模式在Java中的具体实现方式及其应用场景,这对于深入理解和掌握这些设计模式具有重要意义。

    java实验策略模式观察者模式和组合模式.docx

    Java 实验中涉及了三种设计模式:策略模式、观察者模式和组合模式。这三种模式是面向对象设计中常见的行为模式,它们可以帮助我们构建更加灵活、可扩展且易于维护的代码。 1. **策略模式**: 策略模式是一种行为...

    java实验策略规划模式、观察者模式和组合模式.docx

    这里可以使用观察者模式实现。 **实验实例**: - **主题接口**:定义一个 `Subject` 接口,包括添加观察者、移除观察者以及通知观察者的抽象方法。 - **观察者接口**:定义一个 `Observer` 接口,包括更新状态的...

    python 实现 设计模式

    python 实现 观察者模式3(双向解耦 抽象观察者,抽象通知者) python 实现 观察者模式4(委托) python 实现 简单工厂模式 python 实现 命令模式 python 实现 模板方法模式 python 实现 桥接模式 python 实现 适配器...

    java实验策略模式、观察者模式和组合模式.doc

    java实验策略模式、观察者模式和组合模式.doc

    java实验:策略模式、观察者模式和组合模式.pdf

    java实验:策略模式、观察者模式和组合模式.pdf

    Android设计模式之观察者模式

    **Android设计模式之观察者模式** 观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它在Android开发中有着广泛的应用。该模式的主要目的是定义对象之间的一种一对多依赖关系,当一个对象的状态发生...

    PHP 设计模式之观察者模式介绍

    4. **组合(Composition)**:观察者模式中的关系是通过组合而不是继承建立的。这意味着主题可以动态地添加或移除观察者,而无需更改主题或观察者的代码,这遵循了组合复用原则。 5. **注册与通知**:当一个新的...

    基于Java实现的23种设计模式Demo,抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式等

    抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式、桥接模式、组合模式、装饰模式、享元模式、代理模式、命令模式、解释器模式、访问者模式、迭代子模式、中介者模式、备忘录模式、...

    工厂模式与观察着模式的两个例子

    本篇将详细讲解工厂模式和观察者模式,并通过C#语言实现的示例来帮助初学者理解这两种模式的核心概念。 1. 工厂模式: 工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,将对象的创建过程封装起来,...

    深度剖析Java观察者模式.doc

    观察者模式是软件设计模式中的一种行为模式,它在Java中有着广泛的应用。该模式的主要目的是定义对象...在Java中,通过`Observable`和`Observer`的组合,我们可以轻松地实现观察者模式,提高代码的复用性和可维护性。

Global site tag (gtag.js) - Google Analytics