linkin大话设计模式--观察者模式
linkin大话设计模式--观察者模式
观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题。当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自动更新。
在观察者模式中,被观察的对象常常也被称为目标和主题,依赖的对象被称为观察者。
代码如下:
<strong><span style="font-size:14px;">import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import javax.swing.JFrame;
import javax.swing.JLabel; public class Product extends ObServable{
//定义2个属性
private String name;
private double price; public Product(){ } public Product(String name, double price) {
super();
this.name = name;
this.price = price;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
notifyObServer(name);
} public double getPrice() {
return price;
} public void setPrice(double price) {
this.price = price;
notifyObServer(price);
} public static void main(String[] args) {
//创建一个被观察者
Product product = new Product("电视机",250);
//创建2个观察者 观察2个属性
NameObServer nameObServer = new NameObServer();
PriceObServer priceObServer = new PriceObServer();
//在被观察者对象上注册这个观察者
product.registObServer(nameObServer);
product.registObServer(priceObServer);
product.setName("电脑");
product.setPrice(1L);
product.setName("手机");
product.setPrice(2L);
} } //被观察者的抽象父类
abstract class ObServable{
List<ObServer> obServers = new ArrayList<ObServer>(); public void registObServer(ObServer o){
obServers.add(o);
} public void removeObServer(ObServer o){
obServers.remove(o);
} public void notifyObServer(Object value){
for(Iterator it = obServers.iterator();it.hasNext();){
ObServer o = (ObServer) it.next();
o.update(this, value);
}
}
} //观察者接口
interface ObServer{
public void update(ObServable o,Object arg);
} //下面提供2个观察者接口的实现 一个用来观察Product对象的name属性,一个用来观察Product对象的price属性
class NameObServer implements ObServer{ @Override
public void update(ObServable o, Object arg) {
if(arg instanceof String){
String name = (String) arg;
JFrame f = new JFrame("观察者");
JLabel j = new JLabel("名称改变为:"+name);
f.add(j);
f.pack();
f.setVisible(true);
System.out.println(NameObServer.class.getName()+"观察者:"+o+"物品的名称已经变为:"+name);
}else{
System.out.println(NameObServer.class.getName()+"类型不对,这里把这个逻辑过滤...");
}
}
} class PriceObServer implements ObServer{ @Override
public void update(ObServable o, Object arg) {
if(arg instanceof Double){
System.out.println(PriceObServer.class.getName()+"观察者:"+o+"物品的价格已经变为:"+arg);
}else{
System.out.println(PriceObServer.class.getName()+"类型不对,这里把这个逻辑过滤...");
}
} } </span></strong>
linkin大话设计模式--观察者模式的更多相关文章
- linkin大话设计模式--常用模式总结
linkin大话设计模式--常用模式总结 一,常用设计模式定义 Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter( ...
- linkin大话设计模式--单例模式
linkin大话设计模式 开文前先弱弱的问一句:什么是设计模式?我在研究java2ee的时候有研究过,在学js的时候也有看到.设计模式的概念最早源于建筑设计大师<建筑的永恒算法>一书,它表 ...
- linkin大话设计模式--适配器模式
linkin大话设计模式--适配器模式 大家知道,在java中只允许单继承,但是在实际问题中往往都需要多继承,java引入了接口这一概念.(一个类可以实现多个接口) 由于接口中都是抽象方法,那么我们在 ...
- linkin大话设计模式--建造模式
linkin大话设计模式--建造模式 建造模式是对象的创建模式,可以讲一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 建造模式的结构: 抽象建造者 ...
- linkin大话设计模式--模板方法模式
linkin大话设计模式--模板方法模式 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不 ...
- linkin大话设计模式--桥接模式
linkin大话设计模式--桥接模式 桥接模式是一种结构化模式,他主要应对的是:由于实际的需要,某个类具有2个或者2个以上维度的变化,如果只是使用继承将无法实现功能,或者会使得设计变得相当的臃肿.我们 ...
- linkin大话设计模式--门面模式
linkin大话设计模式--门面模式 随着系统的不断改进和开发,他们会变得越来越复杂,系统会生成大量的类,这使得程序的流程更加难以理解.门面模式可以为这些类提供一个简易的接口,从而简化访问这些类的复杂 ...
- linkin大话设计模式--策略模式
linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi] 策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...
- linkin大话设计模式--命令模式
linkin大话设计模式--命令模式 首先考虑一种应用情况,某个方法需要完成某一个功能,这个功能的大部分功能已经确定了,但是有可能少量的步骤没法确定,必须等到执行这个方法才可以确定. 也就是说,我们写 ...
随机推荐
- python3之运算符
1.python算术运算符 >>> a=15 >>> b=5 >>> a+b #加 20 >>> a-b #减 10 >& ...
- PE文件详解(五)
在前面几节中经常提到相对虚拟地址RVA,在这篇博客中主要说明这个概念.本来是想接着转载小甲鱼的,但是我自己根据这篇文章和他的视频来学习的时候,发现在RVA与文件的相对偏移地址进行转化的时候,那块我看不 ...
- [转]python执行bash指令,如果指令返回错误,如何优雅的结束python程序
如果是有返回值的可执行文件可以直接获取return code, 如果error code 直接退出. import os ret = os.system("COMMAND LINE" ...
- IdentityServer(15)- 第三方快速入门和示例
这些示例不由IdentityServer团队维护. IdentityServer团队提供链接到了社区示例,但不能对示例做任何保证. 如有问题,请直接与作者联系. 各种ASP.NET Core安全示例 ...
- 模拟Vue之数据驱动
一.前言 在随笔"模拟Vue之数据驱动1"结尾处,我们说到如果监听的属性是个对象呢?那么这个对象中的其他属性岂不就是监听不了了吗? 如下: 倘若user中的name.age属性变化 ...
- weui中的日期选择控件关于时间段的设置!
近日用到了日期控件,但是需要把时和分去掉,功能上是做一个预约的功能,所以只需要在年月日后面提供时间段的选择. BUG在于如果第一次点开弹框而没做任何操作,然后点了其他任意区域则弹框关闭,甚至你的8:0 ...
- 使用Android-PullToRefresh实现下拉刷新功能
源代码:https://github.com/chrisbanes/Android-PullToRefresh 一. 导入类库 将Library文件夹作为Android项目Import到Eclipse ...
- python解析域名
#coding:utf-8 import socket def URL2IP(): for oneurl in urllist.readlines(): url=str(oneurl.strip()) ...
- cs231n spring 2017 lecture4 Introduction to Neural Networks 听课笔记
1. Backpropagation:沿着computational graph利用链式法则求导.每个神经元有两个输入x.y,一个输出z,好多层这种神经元连接起来,这时候已知∂L/∂z,可以求出∂L/ ...
- 详解zkw算法解决最小费用流问题
网络流的一些基本概念 很多同学建立过网络流模型做题目, 也学过了各种算法, 但是对于基本的概念反而说不清楚. 虽然不同的模型在具体叫法上可能不相同, 但是不同叫法对应的思想是一致的. 下面的讨论力求规 ...