`
liuwei8728
  • 浏览: 33677 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

观察者模式理解

阅读更多

这么个场景: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的方法实现封装起来做个接口,把方法露出来就是。呵呵,门面模式其实还是蛮有意思的。

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

分享到:
评论

相关推荐

    android之观察者模式理解demo

    为了理解观察者模式,本人利用生活中的一个小需求,编写了一个小例子,加强记忆,主要模拟了消费者想购买一辆自行车,并且希望时时知道某自行车店的自行车价格变化,当降价的时候,会收到降价通知,并且购买的一个...

    设计模式实现——观察者模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,...同时,现代编程语言和框架(如React的生命周期方法、Angular的事件机制等)也内置了观察者模式的概念,使得开发者可以更方便地使用和理解这一模式。

    java观察者模式观察者模式

    观察者模式是设计模式中的一种行为模式,它在Java编程中有着广泛的应用。该模式的主要目的是定义对象...在实际开发中,理解并合理运用观察者模式,能够有效地实现对象之间的交互和通信,提升代码的灵活性和可维护性。

    java 设计模式 观察者模式 简单实例 包括测试test类

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,...在实际的Java开发中,理解并熟练运用观察者模式对于编写高质量的代码至关重要。

    Qt设计模式之观察者模式

    本篇文章将深入探讨Qt中的观察者模式(Observer Pattern),这是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心...

    iOS 设计模式 观察者模式

    观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计中的一种行为模式。...无论是使用Apple提供的API还是自定义实现,理解并熟练运用观察者模式都能提升你的编程技能和项目质量。

    观察者模式模版和例子

    在提供的压缩包文件中,`观察者模式模版和例子`可能包含了实现这些概念的代码示例,通过阅读和理解这些代码,你可以更好地掌握观察者模式的实现细节和应用方式。为了深入学习,建议先了解观察者模式的基本概念,然后...

    设计模式-观察者

    《设计模式——观察者》 ...在实际开发中,理解并熟练运用观察者模式能够帮助我们构建更稳定、可维护的系统。无论是简单的用户界面交互,还是复杂的业务逻辑处理,观察者模式都能提供一种有效的解耦方案。

    运用MVC模式及观察者模式的java小程序

    在Java编程领域,设计模式是解决常见问题的模板或最佳实践。在这个名为“运用MVC模式及观察者模式的java小程序”的项目中,我们重点探讨了两种经典的...分析和学习这些代码将有助于深入理解MVC和观察者模式的实际应用。

    [行为型模式] 观察者模式的理解

    .edx和.pdf文件可能包含了这些图形的详细表示,对于深入理解观察者模式的结构和作用非常有帮助。 总的来说,观察者模式是一种强大的设计模式,能够有效地管理对象间的通信,提高系统的灵活性和可扩展性。在实际开发...

    观察者模式练习

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变...在"观察者模式练习"中,我们可以通过`ObserverTest`来体验和理解这一模式的实际运用。

    设计模式之观察者模式

    观察者模式是软件设计模式中的一种行为模式,它在对象之间定义...此外,了解并熟练运用观察者模式还有助于你理解和使用其他设计模式,如命令模式、发布/订阅模式等,这些都是构建可复用、可维护的大型软件系统的关键。

    Java内置观察者模式

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它允许一个对象,当其状态发生改变时,能够自动通知所有依赖它的其他对象。在Java中,这种模式已经被内置到语言核心,使得开发者可以轻松地实现事件驱动...

    java 了解观察者模式

    观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计模式中的行为模式之一,主要用于对象间的一...理解并熟练运用观察者模式,可以提升代码的可维护性和复用性,使得程序设计更加符合面向对象的原则。

    观察者模式源码

    观察者模式(Observer Pattern)是软件设计模式的一种,属于行为型模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于...理解并熟练运用观察者模式,有助于提升软件的可维护性和扩展性。

    浅谈Angular 观察者模式理解

    观察者模式意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 实现过程 在老师教程中学到了 Angularjs 中的观察者模式 不使用观察者模式,登录时不...

    观察者模式代码

    观察者模式是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java或其他面向对象语言中,...理解并熟练运用观察者模式,有助于提高代码的可维护性和可扩展性。

    观察者模式示例源代码

    观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计模式中的行为模式之一。它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式...

Global site tag (gtag.js) - Google Analytics