设计模式-观察者模式

观察者模式详解
本文深入解析了观察者模式的基本概念及其在Java中的实现方式。通过一个具体的案例——模拟Java AWT事件监听,详细展示了如何使用观察者模式进行事件处理系统的构建。

观察者模式:一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。


观察者模式结构:

       Target:(抽象类)

            属性:

                   单个或一组(集合)观察者

                   自身状态,可以一个标记或一组状态值

           方法:

                   自身状态管理

                   观察者管理

                   通知观察者.           

            

         Observe:(观察者):

                 方法: 

                     当target类状态发生改变后的一些逻辑处理。


  观察者模式可以形成链式.



案例,模拟jdk自身AWT事件监听。

代码如下:

被观察者(FRAME)
package com.bo.observe;

import java.util.Vector;

public abstract class AFrame {
	private Vector<IListener> listeners = new Vector<>();
	private boolean isChanged = false;
	public final void setChanged() {
		this.isChanged =true;
	}
	public final void clearChanged(){
		this.isChanged = false;
	}
	public final boolean hasChanged(){
		return this.isChanged;
	}
	public final void addListener(IListener listener){
		this.listeners.addElement(listener);
	}
	public final void removeListener(IListener listener){
		this.listeners.remove(listener);
	}
	
	public final void notifyListener(){
		 this.notifyListener(null);
	}
	public final void notifyListener(Object param){
		for (IListener iListener : listeners) {
			iListener.triggerEventHandler(this, param);
		}
		this.clearChanged();
	}
	public abstract void show();
}

观察者IListener
package com.bo.observe;

public interface IListener {
	public void triggerEventHandler(AFrame frame,Object para);
}

观察者抽象(AListener)实现:
package com.bo.observe;

public abstract class AListener implements IListener {
	 IEvent evnet;
	 public AListener(){}
	 public AListener(IEvent event){}
	 public final IListener bindEvent(IEvent evnet){
		 this.evnet = evnet;
		 return this;
	 }
	 public final IListener cancleEvent(IEvent event){
		 this.evnet = null;
		 return this;
	 } 
}
被观察者状态变化所对应的业务逻辑处理(IEvent),

package com.bo.observe;

public interface IEvent {
		public void handler(Object o);
}

监听具体实现类一:
package com.bo.observe;

public class MouseClickListener extends AListener {
	public MouseClickListener(){}
	public MouseClickListener(IEvent event){}
	@Override
	public void triggerEventHandler(AFrame frame, Object para) {
		// TODO Auto-generated method stub
		if(frame.hasChanged()){
			this.evnet.handler(para);
		}
	}

}

测试类:
package com.bo.observe;
/**
 * 模拟AWT事件监听
 * @author 波
 *
 */
public class TestMain {
	public static void main(String[] args) {
		AFrame frame = new Frame();
		frame.addListener(new MouseClickListener().bindEvent(new IEvent() {
			
			@Override
			public void handler(Object o) {
				// TODO Auto-generated method stub
				System.out.println("事件具体处理:"+o.toString());
			}
		}));
		frame.show();
		System.out.println("======================");
		frame.addListener(new AListener() {
			@Override
			public void triggerEventHandler(AFrame frame, Object para) {
				// TODO Auto-generated method stub
				if(frame.hasChanged()){
					this.evnet.handler(para);
				}
			}
		}.bindEvent(new IEvent() {
			
			@Override
			public void handler(Object o) {
				// TODO Auto-generated method stub
				System.out.println("-------------------------"+o.toString());
			}
		}));
		
		frame.show();
	}
}


输出:
显示框架
事件具体处理:通知,参数
======================
显示框架
事件具体处理:通知,参数
-------------------------通知,参数



内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值