这么个场景: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的方法实现封装起来做个接口,把方法露出来就是。呵呵,门面模式其实还是蛮有意思的。
前面也说了,被观察者实现的时候,属于单线程的方式处理。但现在很多场景都是并发进行,属于多线程方式,所以具体问题具体对待。不多说了,就理解到这,还需要认真理解模式更深邃的东东。
分享到:
相关推荐
为了理解观察者模式,本人利用生活中的一个小需求,编写了一个小例子,加强记忆,主要模拟了消费者想购买一辆自行车,并且希望时时知道某自行车店的自行车价格变化,当降价的时候,会收到降价通知,并且购买的一个...
主要介绍了浅谈Angular 观察者模式理解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
观察者模式Demo,使用推模型。 在我的博客里写了关于我对观察者模式的理解,这里是小例子。
设计模式之观察者模式,简单易学,便于理解。
用C#委托实现的观察者模式的例子,理解委托订阅回调等等
文档加代码,如果看完pdf,观察者模式还没学会,感觉你没必要学设计模式了,文档非常通俗易通,适合新手上手。
针对所有涉及的,监听者模式,观察者模式,订阅者模式的举例介绍,让大家更清晰的理解这几种模式的本质
设计模式之观察者模式,通过形象的例子,来理解!形象化
基于观察者模式和单例模式的java聊天室 面向对象设计,抽象,封装,代理,组合和继承 适合理解java面向对象,socket编程,观察者模式和单例模式
.java文件。观察者模式的例子。可以运行,同时帮助理解观察者模式。
观察者模式实例,用到java的继承,多态,加深概念理解.
实验目的 理解观察者模式,理解JavaBeans的概念,掌握Bean事件的使用,掌握创建自定义源组件与事件组 实验题目 建立一个基于Bean事件的Internet气象观测站
这是我在学习工程中自己对这个模式的理解,大家可以看看
用观察者模式设计一个交通信号灯调度系统,有需要的朋友可以参考下。这是本人写一篇有关于Java中设计模式,多线程调度的一个Demo吧,本人水平有限,望各位博友批评指正。此Demo实现了现实交通信号灯调度车辆通行的功能,...
这个代码主要以Android中的TextView发生变化,而凡是订阅了此类消息的实体类对象均能够打印出日志。例子很简单,起抛砖引玉,希望大家能够理解观察者模式在Android中的应用
委托和事件-观察者设计模式 初学者对事件委托,观察模式的理解!
NULL 博文链接:https://jacky-dai.iteye.com/blog/2309028
我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...
主要是对javascript的面向对象思想的一个理解,有简单的单例模式,工厂模式,观察者模式含代码。