设计模式
来源:互联网 发布:平安银行淘宝卡 白金卡 编辑:程序博客网 时间:2024/06/17 19:10
观察者模式
抽象(被观察者)主题角色:把要观察的对象放到队列中,保存注册的观察者对象
Subject:
方法有
attach()注册添加观察者对象
detach()删除观察者对象
nodifyObservers(
String newState)通知所有注册的观察者对象,状态改变时通知,遍历观察者对象
public abstract class Subject {
/**
* 用来保存注册的观察者对象
*/
private List<Observer> list = new ArrayList<Observer>();
/**
* 注册观察者对象
* @param observer 观察者对象
*/
public void attach(Observer observer){
list.add(observer);
System.out.println("Attached an observer");
}
/**
* 删除观察者对象
* @param observer 观察者对象
*/
public void detach(Observer observer){
list.remove(observer);
}
/**
* 通知所有注册的观察者对象
*/
public void nodifyObservers(String newState){
for(Observer observer : list){
observer.update(newState);
}
}
}
——————————————————————————————————————————————————————————
具体的主题角色类
public class ConcreteSubject extends Subject{
private String state;
public String getState() {
return state;
}
public void change(String newState){
state = newState;
System.out.println("主题状态为:" + state);
//状态发生改变,通知各个观察者
this.nodifyObservers(state);
}
}
————————————————————————————————————————————————————————
抽象观察者角色类
public interface Observer {
/**
* 更新接口
* @param state 更新的状态
*/
public void update(String state);
}
public abstract class Observer{
public void update(String state);
}
——————————————————————————————————————————————————————————
具体的观察者角色类
public class ConcreteObserver implements Observer {
//观察者的状态
private String observerState;
@Override
public void update(String state) {
/**
* 更新观察者的状态,使其与目标的状态保持一致
*/
observerState = state;
System.out.println("状态为:"+observerState);
}
}
————————————————————————————————————————————————————————
两种模式的比较
■ 推模型是假定主题对象知道观察者需要的数据;而拉模型是主题对象不知道观察者具体需要什么数据,没有办法的情况下,干脆把自身传递给观察者,让观察者自己去按需要取值。
■ 推模型可能会使得观察者对象难以复用,因为观察者的update()方法是按需要定义的参数,可能无法兼顾没有考虑到的使用情况。这就意味着出现新情况的时候,就可能提供新的update()方法,或者是干脆重新实现观察者;而拉模型就不会造成这样的情况,因为拉模型下,update()方法的参数是主题对象本身,这基本上是主题对象能传递的最大数据集合了,基本上可以适应各种情况的需要。
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
责任链模式
(击鼓传花)
抽象处理者角色
public abstract class Handler {
/**
* 持有后继的责任对象
*/
protected Handler successor;
/**
* 示意处理请求的方法,虽然这个示意方法是没有传入参数的
* 但实际是可以传入参数的,根据具体需要来选择是否传递参数
*/
public abstract void handleRequest();
/**
* 取值方法
*/
public Handler getSuccessor() {
return successor;
}
/**
* 赋值方法,设置后继的责任对象
*/
public void setSuccessor(Handler successor) {
this.successor = successor;
}
}
————————————————————————————————————————————————————————————————————————————————
具体的处理者角色
public class ConcreteHandler extends Handler {
/**
* 处理方法,调用此方法处理请求
*/
@Override
public void handleRequest() {
/**
* 判断是否有后继的责任对象
* 如果有,就转发请求给后继的责任对象
* 如果没有,则处理请求
*/
if(getSuccessor() != null)
{
System.out.println("放过请求");
getSuccessor().handleRequest();
}else
{
System.out.println("处理请求");
}
}
}
————————————————————————————————————————————————————————————————————————————
调用
public class Client {
public static void main(String[] args) {
//组装责任链
Handler handler1 = new ConcreteHandler();
Handler handler2 = new ConcreteHandler();
handler1.setSuccessor(handler2);
//提交请求
handler1.handleRequest();
}
}
_________________________________________________________________________________
http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html
0 0
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式~~~~~~~~~~
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- Dynamic CRM BI Report
- tjut 3090
- 一个android菜鸟android studio 上传项目到github之旅
- Linux 下修改(NTFS或fuseblk)磁盘(卷标)显示名称
- Linux 常用命令 1
- 设计模式
- 原来这也叫做建树(利用数组的下标和值来建立关系网)
- 定时任务crontab
- restful 风格&判断是不是Ajax请求
- 关于Unity的LayerMask的实现原理
- jdk8与Eclipse Mars.2 Release (4.5.2)不兼容
- OSG开发环境搭建
- UnityPlayerActivity和UnityGooglActivity
- java正则表达