MyException - 我的异常网
当前位置:我的异常网» 软件架构设计 » 观察者模式懂得

观察者模式懂得

www.MyException.Cn  网友分享于:2013-08-26  浏览:0次
观察者模式理解

这么个场景:ATM取款机,你输入密码。如果正确,那么进去取款页面。但是如果错误,则重新输入,当输入次数=3的时候,此时,ATM机器吞没你的卡片,同时触发几件事情:1.拍照  2.通知系统  3.页面初始化,给别人用。

对于一个ATM取款机,由于只可能一个人进行操作,因此这里将该场景看为一个单线程操作。

根据我对观察模式的理解,就是有观察者、有被观察者,如果被观察者有事件发生,那么将触发观察者相应的事件发生。因此上面的场景完全可以用观察模式进行模拟。

首先对被观察者进行实现:

public interface Observable {
	
	public void inputPassword(String _psw);
	public void addObserver(Observer _o);
}

 

import java.util.ArrayList;


public class ATMObservable implements Observable {

	private String password;
	private int count;
	private ArrayList<Observer> list=new ArrayList<Observer>();
	
	@Override
	public void inputPassword(String _psw) {
		this.password = _psw;
		this.getInputPswCount();
	}

	public String getPassword() {
		return password;
	}

	public boolean hasEnd(){
		boolean Flag=false;
		if(count>=3){
			count=0;
			Flag=true;
		}
		return Flag;
	}
	
	private int getInputPswCount(){
		if("123456".equals(this.password)){
			System.out.println("**先生/小姐,欢迎您使用XXX");
			count=0;
		}else{
			System.out.println("您输入的密码有误,请重新输入。");
			count++;
			this.dispeareCard();
		}
		return count;
	}
	
	private void dispeareCard(){
		if(this.hasEnd()){
			System.out.println("对不起,你密码输入次数过多,怀疑此卡不为您所有。此卡已吞并,若有问题请联系银行,电话****");
			this.operate();
		}
	}
		
	private void operate(){
		for (Observer observer:list) {
			observer.operate();
		}
	}
	
	public void addObserver(Observer _o){
		this.list.add(_o);
	}

	public int getCount() {
		return count;
	}
}

 

这里被观察者的接口只声明了两个方法,而实现类却有好几个方法,主要是为了减少暴漏在外面的方法,其他的方法封装好,不给调用。符合当前一些设计的要求。

类实现中,主要的方法体为addObserver(Observer _o)和operate(),他们的作用主要是增加观察者和在某些情况下触发事件。
下面就是把观察者的场景给模拟出来就是。

public interface Observer {
	public void operate();
}

 

public class Photo implements Observer {

	@Override
	public void operate() {
		System.out.println("废物!密码都不记得,把你音容相貌记下来!");
	}
}

 

public class CallSystem implements Observer {

	@Override
	public void operate() {
		System.out.println("啥也不说,我通知监控系统!");
	}

}

 

public class InitePage implements Observer {

	@Override
	public void operate() {
		System.out.println("嘿,你以为就只为你服务啊,不好意思,下一位!有问题,联系电话:****");
	}
}

 

好了,关键到了,下面就是客户端实施了。看,一小偷过来了,鄙视。幸亏ATM这样的方式,想当年哥把银行卡和身份证一起给丢了,哎!不提也罢。

public class Client {

	public static void main(String[] args) {
		//把几个观察者给整出来
		Observer photo=new Photo();
		Observer callsystem=new CallSystem();
		Observer initepage=new InitePage();
		
		//然后把观察者加到被观察范围
		Observable atm=new ATMObservable();
		atm.addObserver(photo);
		atm.addObserver(callsystem);
		atm.addObserver(initepage);
		
		//好了,来了个坏蛋或者13,当然还是要给你三次机会嘛,让你瞎试!
		for (int i = 0; i < 3; i++) {
			switch(i){
			case 0:
				atm.inputPassword("134523");
				break;
			case 1:
				atm.inputPassword("324123");
				break;
			case 2:
				atm.inputPassword("322221");
				break;
			default:
					System.out.println("搞什么东东!");
			}
		}
		
	}
}

 

因为我这边是模拟,只允许输入三次,所以就用上面的方式处理了,代码有点多。哎,凑合着看吧,主要是为了把这模式和场景进行实现嘛。

当然,记得前面看过门面模式,既然不想让人家看你输入的密码啥的,那把main的方法实现封装起来做个接口,把方法露出来就是。呵呵,门面模式其实还是蛮有意思的。

前面也说了,被观察者实现的时候,属于单线程的方式处理。但现在很多场景都是并发进行,属于多线程方式,所以具体问题具体对待。不多说了,就理解到这,还需要认真理解模式更深邃的东东。

文章评论

程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
中美印日四国程序员比较
中美印日四国程序员比较
一个程序员的时间管理
一个程序员的时间管理
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
为什么程序员都是夜猫子
为什么程序员都是夜猫子
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
10个调试和排错的小建议
10个调试和排错的小建议
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员都该阅读的书
程序员都该阅读的书
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
 程序员的样子
程序员的样子
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
如何成为一名黑客
如何成为一名黑客
漫画:程序员的工作
漫画:程序员的工作
老程序员的下场
老程序员的下场
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
旅行,写作,编程
旅行,写作,编程
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
每天工作4小时的程序员
每天工作4小时的程序员
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
程序员必看的十大电影
程序员必看的十大电影
鲜为人知的编程真相
鲜为人知的编程真相
那些争议最大的编程观点
那些争议最大的编程观点
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
我的丈夫是个程序员
我的丈夫是个程序员
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有