MVP观察者模式
从网上找的两段代码。很好的诠释了MVP观察者模式。
这两段代码可以看成是两个小小的框架了。
从中学习下MVP观察者模式的思想。很有帮助的。
java代码
import java.util.Vector;
public abstract class Subject {
//观察者列表
private Vector<Observer> vectObserver = new Vector<Observer>();
//增加一个观察者
public void attach(Observer observer){
vectObserver.add(observer);
}
//去除一个观察者
public void detach(Observer observer){
vectObserver.remove(observer);
}
//通知观察者更新
public void notifyObservers(){
for(int i=0; i<vectObserver.size(); i++){
Observer observer = vectObserver.get(i);
observer.update();
}
}
//获取主题信息
public abstract String getSubject();
}
//银行柜台类
public class Counter extends Subject{
//当前业务号
private String bizNo;
//柜台名称
private String name;
//构造函数
public Counter(String name){
this.name = name;
}
//获取当前业务号
public String getBizNo(){
return this.bizNo;
}
//设置当前业务号
public void setBizNo(String bizNo){
this.bizNo = bizNo;
}
//获取主题信息
public String getSubject(){
return “请” + this.bizNo + “号到” + this.name + “号柜台办理业务”;
}
}
//管理部门类
public class Manager extends Subject{
//管理部门名称
private String name;
//构造函数
public Manager(String name){
this.name = name;
}
//获取主题信息
public String getSubject(){
return this.name + “发布最新紧急公告”;
}
}
//观察者基类
public abstract class Observer {
protected String name;
protected Subject subject;
//构造函数
public Observer(String name,Subject subject){
this.name = name;
this.subject = subject;
}
//更新信息
public abstract void update();
}
//小显示屏类
public class SmallScreen extends Observer{
//构造函数
public SmallScreen(String name,Subject subject){
super(name,subject);
}
//更新显示屏
public void update(){
try{
System.out.println(this.name + “:” + subject.getSubject());
}
catch(Exception err){
}
}
}
//音箱类
public class Speaker extends Observer{
//构造函数
public Speaker(String name,Subject subject){
super(name,subject);
}
//更新音箱
public void update(){
try{
System.out.println(this.name + “:” + subject.getSubject());
}
catch(Exception err){
}
}
}
//业务系统类
public class BankBiz {
public static void main(String[] args) {
//银行柜台
Counter counter = new Counter(“1号柜台”);
//1,2号小屏、3号音箱
SmallScreen smallScreen1 = new SmallScreen(“1号小屏”,counter);
SmallScreen smallScreen2 = new SmallScreen(“2号小屏”,counter);
Speaker speaker = new Speaker(“3号音箱”,counter);
//银行柜台加入观察者
counter.attach(smallScreen1);
counter.attach(smallScreen2);
counter.attach(speaker);
//9号办理业务
counter.setBizNo(“9″);
//通知更新
counter.notifyObservers();
//管理部门
Manager manager = new Manager(“风险控制部”);
//1号小屏
smallScreen1 = new SmallScreen(“1号小屏”,manager);
//管理部门加入观察者
manager.attach(smallScreen1);
//通知更新
manager.notifyObservers();
}
}
php代码
//主题基类
abstract class Subject {
//观察者列表
private $arrObserver = array();
//增加一个观察者
public function attach(&$observer){
$this->arrObserver[] = $observer;
}
//去除一个观察者
public function detach(&$observer){
for($i=0; $i<count($this->$arrObserver); $i++){
$objTemp = $this->$arrObserver[$i];
if($observer === $objTemp){
array_splice($this->$arrObserver,$i,1);
break;
}
}
}
//通知观察者更新
public function notifyObservers(){
foreach ($this->arrObserver as $observer){
$observer->update();
}
}
//获取主题信息
public abstract function getSubject();
}
//银行柜台类
class Counter extends Subject {
//当前业务号
private $bizNo = “”;
//柜台名称
private $name = “”;
//构造函数
public function __construct($name){
$this->name = $name;
}
//获取当前业务号
public function getBizNo(){
return $this->bizNo;
}
//设置当前业务号
public function setBizNo($bizNo){
$this->bizNo = $bizNo;
}
//获取主题信息
public function getSubject(){
return “请” + $this->bizNo . “号到” . $this->name . “号柜台办理业务”;
}
}
//管理部门类
class Manager extends Subject{
//管理部门名称
private $name = “”;
//构造函数
public function __construct($name){
$this->name = $name;
}
//获取主题信息
public function getSubject(){
return $this->name . “发布最新紧急公告”;
}
}
//观察者基类
abstract class Observer {
protected $name = “”;
protected $subject = “”;
//构造函数
public function __construct($name,$subject){
$this->name = $name;
$this->subject = $subject;
}
//更新信息
public abstract function update();
}
//小显示屏类
class SmallScreen extends Observer{
//构造函数
public function __construct($name,$subject ){
parent::__construct($name,$subject);
}
//更新显示屏
public function update(){
echo $this->name . “:” . $this->subject->getSubject();
}
}
//音箱类
class Speaker extends Observer{
//构造函数
public function __construct($name,$subject){
parent::__construct($name,$subject);
}
//更新音响
public function update(){
echo $this->name . “:” . $this->subject->getSubject();
}
}
//业务系统类
class BankBiz {
public static function execute() {
//银行柜台
$counter = new Counter(“1号柜台”);
//1,2号小屏、3号音箱
$smallScreen1 = new SmallScreen(“1号小屏”,$counter);
$smallScreen2 = new SmallScreen(“2号小屏”,$counter);
$speaker = new Speaker(“3号音箱”,$counter);
//银行柜台加入观察者
$counter->attach($smallScreen1);
$counter->attach($smallScreen2);
$counter->attach($speaker);
//9号办理业务
$counter->setBizNo(“9″);
//通知更新
$counter->notifyObservers();
//管理部门
$manager = new Manager(“风险控制部”);
//1号小屏
$smallScreen1 = new SmallScreen(“1号小屏”,$manager);
//管理部门加入观察者
$manager->attach($smallScreen1);
//通知更新
$manager->notifyObservers();
}
}
BankBiz::execute();
?>
原文地址: http://www.gosoa.com.cn/category/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F
本文地址:http://blog.csdn.net/aerchi/article/details/42131157