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大话设计模式--命令模式 首先考虑一种应用情况,某个方法需要完成某一个功能,这个功能的大部分功能已经确定了,但是有可能少量的步骤没法确定,必须等到执行这个方法才可以确定. 也就是说,我们写 ...
随机推荐
- 虚拟机迁移(QEMU动态迁移,Libvirt动(静)态迁移)
动静态迁移的原理 静态迁移是指在虚拟机关闭或暂停的情况下,将源宿主机上虚拟机的磁盘文件和配置文件拷贝到目标宿主机上.这种方式需要显式的停止虚拟机运行,对服务可用性要求高的需求不合适. *** 动态迁移 ...
- [转载]解决sudo: sorry, you must have a tty to run sudo
前几天遇到一个问题,在一个终端中调用另一个shell,始终是无法执行的,后来捕捉到报错信息为sudo: sorry, you must have a tty to run sudo,后来,在网上了解到 ...
- android支付宝app支付(原生态)-包括android前端与java后台
本文讲解了 android开发的原生态app集成了支付宝支付, 还提供了java后台服务器处理支付宝支付的加密代码, app前端与java后台服务器使用json数据格式交互信息,java后台服务主要用 ...
- NC和NO、耳机美标和欧标的区别
NO是常开(NORMAL OPEN),就是通常即未通电状态下,是断开的,通电后在电磁线圈的作用下(吸合)处于闭合状态.NC是常闭(NORMAL CLOSE),就是通常即未通电状态下,是闭合的,通电后在 ...
- dos命令的小总结
DOS命令与批处理:目的:简单高效.为我们以后学习linux操作系统做准备进行DOS命令窗口: 运行---输入cmd主要包括目录操作类命令.磁盘操作类命令.文件操作类命令和其它命令 1.在d盘创建一个 ...
- MySQL索引 - 索引的类型
索引的类型 B-Tree索引 B-Tree 索引 通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同. B-Tree 索引 能够加快访问数据的速度,存储引擎不再需要进行全表扫描来获取需 ...
- 【测试编码URI的函数】
//测试编码URI的函数 var url="http://www.phpfamily.org/test.php?search= this is a test&sum=1+2" ...
- 图的简单应用(C/C++实现)
存档: #include <stdio.h> #include <stdlib.h> #define maxv 10//定义最大顶点数 typedef char elem;// ...
- BZOJ:4873: [Shoi2017]寿司餐厅
4873: [Shoi2017]寿司餐厅 首先很开心在膜你赛的时候做了出来. 看到数据范围,看到不能dp,看到贡献去重后计算,咦,流? 那就容易了,转最大权闭合子图,每个区间建一个点,取了就一定要取他 ...
- 51Nod 1003 阶乘后面0的数量(数学,思维题)
1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720 ...