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大话设计模式--命令模式 首先考虑一种应用情况,某个方法需要完成某一个功能,这个功能的大部分功能已经确定了,但是有可能少量的步骤没法确定,必须等到执行这个方法才可以确定. 也就是说,我们写 ...
随机推荐
- python获取指定目录下的所有指定后缀的文件名
使用到的函数有: os.path.splitext():分离文件名与扩展名 os.path.splitext(file)[] 获得文件名 os.path.splitext(file)[] 获得文件扩展 ...
- python 浅析类方法与静态方法
类方法,静态方法的定义 Python 是双面向的,既可以面向函数编程,也可以面向对象编程,所谓面向函数就是单独一个. py 文件,里面没有类,全是一些函数,调用的时候导入模块,通过模块名.函数名()即 ...
- 【转载】mysql binlog日志自动清理及手动删除
说明:当开启mysql数据库主从时,会产生大量如mysql-bin.00000* log的文件,这会大量耗费您的硬盘空间.mysql-bin.000001mysql-bin.000002mysql-b ...
- 浏览器history操作实现一些功能
返回拦截 功能:从广告进入到落地页后,给history增加一个页面,拦截返回动作 主要用到的是h5中的history对象,使用了pushState,和replaceState来操作. 并且加入了一些条 ...
- python将数据写入excel代码,python与office交互
# -*- coding: utf-8 -*- from smartframe.header import * import pymysql import json import importlib, ...
- 利用python的timeit库计算程序运行的时长
from timeit from time import clock start = clock() # 此处填写需要运行的函数 end = clock() print(end - start)
- VFS四大对象之一 struct super_block
linux虚拟文件系统四大对象: 1)超级块(super block) 2)索引节点(inode) 3)目录项(dentry) 4)文件对象(file) 现在先介绍第一个 一.super_block的 ...
- 385cc412a70eb9c6578a82ac58fce14c 教大家破解md5验证值
Md5密文破解(解密)可以说是网络攻击中的一个必不可少的环节,是工具中的一个重要"辅助工具".md5解密主要用于网络攻击,在对网站等进行入侵过程,有可能获得管理员或者其他用户的账号 ...
- 从好用到更好用 —— 2017 年又拍云 CDN 功能更新回顾
又拍云一直致力于为客户带来更好的服务,在 2017 年又拍云 CDN 服务进行了数次重大更新,在功能上更加全面.完善,进一步提升了 CDN 的稳定性与安全性. 在过去一年里又拍云 CDN 服务共进行了 ...
- CTF---Web入门第十一题 PHP大法
PHP大法分值:20 来源: DUTCTF 难度:中 参与人数:8205人 Get Flag:2923人 答题人数:3042人 解题通过率:96% 注意备份文件 解题链接: http://ctf5.s ...