观察者模式(Observer Pattern)例子

Java的API中有两组接口类是用来写观察者模式用的,分别是java.util.Observable、java.util.Observer和java.util.EventListener、Java.util.EventObject。本文并没有直接使用到这些API,而是自定义一套观察者模式中相关的接口类,且选取一个日常生活中常见的一个事件来说明观察者模式的使用。

clip_image002[13]

现实场景:有一名店(Shop),为了财物安全起见,除了在店内装了摄像头(Camera)来监控店内的总人数外,还聘请了一些门卫(Camera)守在店门口,对来访的客人进行实名登记,即客人进入时要记名,客人出店时也要记录其离去。

//Watcher接口:

package  simple.observer;

/**
 * 观察者接口
 * 
@author rongxinhua
 *
 
*/

public   interface  Watcher  {

    
/**
     * (接收到通知后,)观察者采取行动
     * 
@param msg
     
*/

    
public void takeAction(Object  msg);
    
}


//Watchable类:

package  simple.observer;

import  java.util.HashSet;
import  java.util.Set;

/**
 * "被观察对象" 的父类
 * 
@author rongxinhua
 *
 
*/

public   class  Watchable  {
    
    
private Set<Watcher> watcherSet = new HashSet<Watcher>();
    
    
/**
     * 通知观察者
     * 
@param params 通知的信息数组
     
*/

    
protected void notifyWatchers(Object params){
        
for(Watcher watcher : watcherSet) {
            watcher.takeAction(params);        
//观察者采取行动
        }

    }

    
    
/**
     * 增加观察者
     * 
@param watcher
     
*/

    
protected void addWatcher(Watcher watcher){
        watcherSet.add(watcher);
    }

    
    
/**
     * 移除观察者
     * 
@param watcher
     
*/

    
protected void removeWatcher(Watcher watcher) {
        watcherSet.remove(watcher);
    }

    
}

 
//Shop类,继承了Watchable类,Shop内有什么动静,会通过调用父类的notifyWatcher()方法通知观察者。

package  simple.observer;

import  java.util.HashSet;
import  java.util.Set;

/**
 * 店类,可被观察的
 * 
@author rongxinhua
 *
 
*/

public   class  Shop  extends  Watchable  {

    
static String IN = "in";    //进入
    static String OUT = "out";    //出去
    
    Set
<String> personSet = new HashSet<String>();
    
int pcount = 0;        //店内总人数
    
    
/**
     * 来访登记
     * 
@param name
     
*/

    
public void comeIn(String name){
        personSet.add(name);
        pcount 
= personSet.size();
        notifyWatchers(IN, name, pcount);    
//通知观察者
    }

    
    
/**
     * 出店登记
     * 
@param name 
     
*/

    
public void getOut(String name){
        personSet.remove(name);
        pcount 
= personSet.size();
        notifyWatchers(OUT, name, pcount);    
//通知观察者
    }

    
}


//Guard(门卫类)和Camera(摄像头类)都属于本例中的观察者,负责观察店内外的动静,

package  simple.observer;

/**
 * 门卫(保安)类
 * 
@author rongxinhua
 *
 
*/

public   class  Guard  implements  Watcher  {
    
    
private String name;    //门卫姓名

    
public Guard(){}
    
    
public Guard(String name){
        
this.name = name;
    }

    
    @Override
    
public void takeAction(Object  msg) {
        
if(msg[0].equals("in")){
            System.out.println(
this.name + "向管理处汇报:“" + msg[1+ "”已进入本店!");
        }

        
else if(msg[0].equals("out")){
            System.out.println(
this.name + "向管理处汇报:“" + msg[1+ "”已走出本店!");
        }

    }

    

}

 

package  simple.observer;

/**
 * 摄像头类
 * 
@author rongxinhua
 *
 
*/

public   class  Camera  implements  Watcher  {
    
    
private int id;        //摄像头编号
    
    
public Camera(int id){
        
this.id = id;
    }


    @Override
    
public void takeAction(Object msg) {
        System.out.println(
"摄像头" + id + "号监测到现在店内总人数为" + msg[2+ "");
    }


}


//测试类代码:

package  simple.observer;

public   class  Test02  {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        Shop shop 
= new Shop();
        
        
//添加摄像头1号
        Camera camera = new Camera(1);
        shop.addWatcher(camera);
        
        
//添加门卫一号
        Guard guard1 = new Guard("门卫一号");
        shop.addWatcher(guard1);
        
        
//来访登记、出门登记
        shop.comeIn("BlogJava");
        shop.comeIn(
"JavaEye");
        shop.getOut(
"BlogJava");
        
        
//移除门卫一号,派他去做别的事
        shop.removeWatcher(guard1);    
        
        
//进入无人观察状态,随进随出
        shop.comeIn("CSDN");
        shop.getOut(
"JavaEye");
        shop.comeIn(
"心梦帆影");
        
        
//添加门卫二号
        Guard guard2 = new Guard("门卫二号");
        shop.addWatcher(guard2);
        
        
//来访登记,出门登记
        shop.comeIn("容新华");
        shop.getOut(
"CSDN");
        
    }


}

运行测试类,结果如下:
 1 门卫一号向管理处汇报:“BlogJava”已进入本店!
 2 摄像头1号监测到现在店内总人数为1人
 3 门卫一号向管理处汇报:“JavaEye”已进入本店!
 4 摄像头1号监测到现在店内总人数为2人
 5 门卫一号向管理处汇报:“BlogJava”已走出本店!
 6 摄像头1号监测到现在店内总人数为1人
 7 摄像头1号监测到现在店内总人数为2人
 8 摄像头1号监测到现在店内总人数为1人
 9 摄像头1号监测到现在店内总人数为2人
10 门卫二号向管理处汇报:“容新华”已进入本店!
11 摄像头1号监测到现在店内总人数为3人
12 门卫二号向管理处汇报:“CSDN”已走出本店!
13 摄像头1号监测到现在店内总人数为2人



本文转载自 http://www.blogjava.net/rongxh7(心梦帆影JavaEE技术博客)
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值