用java观察者模式解耦经典三层架构

三层架构是一个很经典的架构模式,依据系统的职责不同。将系统分成了表现层,逻辑层和数据訪问层,而且配合数据实体进行传输数据,能够大大的封装性和复用性。

经典的三层架构图:

我们再深入到架构图内部。看看详细的类图,用简单的登陆举例吧:

这里通过LoginUI。调用了LoginLogService和LoginVerificationService两个类。通过类图能够看得出,U层和Service层(本文把BLL层称为了Service层)直接採用了直接调用的方式。

在面向对象的设计中。一直强调要面向接口编程,好我们把接口加上:

好了。加上接口以后。再用上工厂方法或者依赖管理的框架spring,就能够实现U层和Service层的解耦了。我们随时针对LoginLogService和LoginVerificationService进行替换。这既符合针对接口编程。由符合开闭原则。也符合里氏替换。

好。那我有一个问题。我不想更改当前的两个逻辑,想加入第三个逻辑。是不是得改U层的类了?

好了,接下来是观察者模式应该出场的时候了,让我们看看怎么利用这个模式来解决逻辑加入,来实现三层架构的真正解耦(这里主要指U层和Service层的耦合)。事实上观察者模式就是java托付的实现方式。

首先说明下思路。我们把LoginUI作为事件源,发usernamepassword作为消息发送出去。注冊过的Service能够处理消息,也就是说通过消息对U层和Service层进行了解耦。来看下类图

这里LoginUI变成了LoginEventSource,变成了事件源,而且继承了EventSource抽象类,两个Service类继承了Listener接口,成为了监听者。

那详细是怎么解耦的呢?

首先看EventSource抽象类。该抽象类实现了事件源的注冊、删除和通知方法。

package com.tgb.chargeSystem;

import java.util.ArrayList;

public abstract class EventSource {
	//keep registered listener
	private ArrayList<Listener> listeners=new ArrayList<Listener>();

	//register listener to EventSource
	//EventSource have data that Listener interested in
	public void registerListener(Listener listener){
		listeners.add(listener);
	}

	//stop focuse on this event
	public void removeListener(Listener listener){
		int i=listeners.indexOf(listener);
		if(i>0){
			listeners.remove(i);
		}
	}

	//EventSource notify listener and send itself as message
	public void notifyListenner(){
		for(int i=0;i<listeners.size();i++){
			Listener listener=listeners.get(i);
			listener.actionPerformed(this);
		}
	}

}

接下来看下EventSource的子类LoginEventSource,它提供了两个回调方法。

package com.tgb.chargeSystem;

import java.util.ArrayList;

public class LoginEventSource extends EventSource{
	private String username="xqf";
	private String password="123";

	//Callback method ,when success in verification,be invoked
	public String LoginSuccess(){
		System.out.println(this.getClass().getName()+"print:Login Success");
		return "Success";
	}
	//Callback method ,when fail in verification,be invoked
	public String LoginFail(){
		System.out.println(this.getClass().getName()+"print:Login Fail");
		return "Fail";
	}

	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}

接下来看看Listener接口

package com.tgb.chargeSystem;

public interface Listener {
	void actionPerformed(EventSource e);
}

实现了Listener接口的LoginLogListener类

package com.tgb.chargeSystem;

public class LoginLogListener implements Listener {

	public LoginLogListener(EventSource eventSource){
		eventSource.registerListener(this);
	}
	@Override
	public void actionPerformed(EventSource e) {

		System.out.println("======保存日志到txt文件==========");
		System.out.println("username:"+((LoginEventSource)e).getUsername()+",password:"+((LoginEventSource)e).getPassword());
		System.out.println("=======保存完成==========");

	}

}

实现了Listener接口的LoginVerificationListener类:

package com.tgb.chargeSystem;

public class LoginVerificationListener implements Listener{

	private static final String USERNAME="xqf";
	private static final String PASSWORD="123"; 

	public LoginVerificationListener(EventSource eventSource){
		//register itself to EventSource
		eventSource.registerListener(this);
	}
	@Override
	public void actionPerformed(EventSource e) {
		System.out.println(this.getClass().getName()+"print: invoke actionPerformed method");
		LoginEventSource les=(LoginEventSource)e;
		//according to username and passowrd,call Callback method
		if(les.getUsername().equals(USERNAME)&&les.getPassword().equals(PASSWORD)){
			les.LoginSuccess();
		}else{
			les.LoginFail();
		}
	}

}

到此,我们还须要一个类,把listener类注冊到事件源,这样。事件源也就是U层就能够发消息给Service层了,这里我们暂且把这个类放到U层。

这是当我们再想加入逻辑,仅仅须要实现Listener接口,而且改动一下以下这个类,把新加入的类注冊到LoginEventSource上就能够了。

public static void main(String[] args){

		LoginEventSource loginEventSource=new LoginEventSource();

		LoginLogListener lll=new LoginLogListener(loginEventSource);
		LoginVerificationListener lvl=new LoginVerificationListener(loginEventSource);

		loginEventSource.notifyListenner();
}
时间: 2024-08-24 11:16:01

用java观察者模式解耦经典三层架构的相关文章

MVC框架模式和Javaweb经典三层架构

一.MVC设计模式 1.MVC的概念 首先我们需要知道MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller),即为MVC.它是一种软件设计的典范,最早为Trygve Reenskaug提出,为施乐帕罗奥多研究中心(Xerox PARC)的Smalltalk语言发明的一种软件设计模式. 2.MVC的详解 虽然MVC并不是Java当中独有的,但是现在几乎所有的B/S的架构都

JAVA学习笔记(五十三)- 经典三层架构实例

UserDAO接口 /* * UserDAO接口 */ public interface UserDAO { //插入用户 public void insert(User user); //删除用户 public void delete(int id); //更新用户 public void update(User user); //查询所有用户 public List<User> getAllUsers(); //根据用户名或密码查询用户 public boolean checkUser(U

经典三层架构

The Repository Pattern with EF Code First & Dependency Injection in ASP.NET MVC3 Ray_Liang, 4 Jul 2011 GPL3 4.67 (58 votes) Rate this: vote 1vote 2vote 3vote 4vote 5 In this article, I will explain how to implement Respository pattern with EF4.1 code

用Spring提高java观察者模式灵活性

在上篇博客 用java观察者模式解耦经典三层架构 的最后,用了一个Client类把Listener的实现类注冊到了LoginEventSource类中,假设须要加入?新的逻辑,加入?新的listener类后,还是须要改动Client类,那么我们能够借助spring提供的容器来帮助我们完好观察者模式. 在spring,在src下建立spring配置文件 <bean id="sessionFactory" class="org.springframework.orm.hib

分享基于EF+WCF的通用三层架构及解析

本项目结合EF 4.3及WCF实现了经典三层架构,各层面向接口,WCF实现SOA,Repository封装调用,在此基础上实现了WCFContext,动态服务调用及一个分页的实例. 1. 项目架构图: 2. 项目解决方案: 在传统的三层架构上增加了WcfService(服务端),WcfClientProxy(客户端服务调用),及WcfExtension(一些扩展) 3. Wcf Service的实现: 工厂实现了RemoteServiceFactory(用于远程调用)和RefServiceFac

浅谈“三层架构”

今天我们来谈谈三层和传说中的"七层". 三层:(先看图)             首先,我觉得学习三层并不太难,体现在三方面:认识不难.理解不难.它所展现的内容不难. "认识三层",网上随便一搜"软件的三层架构"云云,各种文章眼花缭乱.简单说三层就是指"表现层UI.业务逻辑层BLL和数据访问层DAL".表现层主要处理用户与界面的关系,业务逻辑层当然是主要处理业务逻辑,数据访问层就是处理有关数据库的系列操作,比如增删改查等. 其

从三层架构到IoC的蜕变

经典三层 经典三层架构是U层调B层,B层调D层.代码形式如下: D层: package com.tgb.spring.dao; public interface UserDao { public void addUser(String username,String password); } package com.tgb.spring.dao; public class UserDao4MySqlImpl implements UserDao { @Override public void a

JavaWeb体系的MVC与三层架构有什么区别

首先,声明一下,三层是三层,MVC是MVC,这俩是毫无关系的. 三层是从整个应用程序架构的角度来分的三层(如果程序需要,还可以分多层). 三层架构通常包括表示层,业务逻辑层以及数据访问层.虽然三层架构将系统在逻辑上分成了三层,但是它并不是物理上的分层.也就是说,对不同层的代码而言,经历编译.打包.部署后,所有的代码最终还是运行在同一个进程中. MVC是一种设计模式,一种思想,是存在于应用程序(B/S结构:又称之浏览器/服务器)的视图层划分出来的不同功能的几个模块. MVC主要是为了解决应用程序用

Java Web 三层架构详解

java 三层架构ssh 一个spring2.5+hibernate3.2+struts2.0组合框架,使用spring的 IoC来管理应用的 所有bean,包括struts2的 action,充分发挥了spring轻量级框架的 优势.  摘 要: 针对当前Web应用程序开发面临的问题,结合目前比较流行的开源框架Spring.Struts和hibernate,提出了一种开发J2EE Web应用的轻量级解决方案,以帮助开发人员在短期内搭建结构清晰.可复用性好.维护方便的Web应用程序.并且,通过案