[19/05/02-星期四] GOF23_行为型模式(状态模式、观察者模式、备忘录模式)
一、状态模式






【状态接口】
/***
* 房间"状态"接口
*/
package cn.sxt.state; public interface State {
void handle(); }
【管理状态类】
/***
* 环境、上下文类, 管理房间的状态
*如果这是银行系统,这个类就是账号,根据状态的不同,进行不同的操作
*/
package cn.sxt.state; public class HomeContext {
private State state; public void setState(State state) {
System.out.println("修改房间的状态!");
this.state = state;
state.handle();
} }
【房间状态】
/***
* "空闲"状态
*/
package cn.sxt.state; public class FreeState implements State{ @Override
public void handle() {
System.out.println("房间空闲,没人入住!"); }
} /***
* "有人住、房间有人"类
*/
package cn.sxt.state; public class CheckedInState implements State{
@Override
public void handle() {
System.out.println("房间有人,请勿打扰!"); }
} /***
* "已预订" 类
*/
package cn.sxt.state; public class BookedState implements State{
@Override
public void handle() {
System.out.println("房间有人预定!"); } }
【客户类】
/**
* 客户
*/
package cn.sxt.state; public class Client {
public static void main(String[] args) {
HomeContext ctx=new HomeContext();//状态对象
ctx.setState(new FreeState());//设置状态为 空闲状态
ctx.setState(new BookedState());
} }
二、观察者模式(Observer)






【目标类-广播站】
/**
* "目标"类 广播站
*/
package cn.sxt.observer; import java.util.ArrayList;
import java.util.List; public class Subject {
protected List<Observer> list=new ArrayList<Observer>(); public void registerObserver(Observer obs){
list.add(obs);//注册观察者,就是听众
} public void removeObserver(Observer obs){
list.remove(obs);//删除观察者,就是听众
} public void notifyAllObserver() {//通知所有观察者,更新状态
for (Observer obs : list) {
obs.update(this);
}
} } /***
* "一个具体的广播站"
*/
package cn.sxt.observer; public class ConcreteSubject extends Subject {
private String state; public String getState() {
return state;
} public void setState(String state) {
this.state = state;
this.notifyAllObserver();//状态变化有变化请通知其它的观察者
} }
【观察者-听众】
/***
* "观察者"接口
*/
package cn.sxt.observer; public interface Observer {
void update(Subject subject); } /***
* A观察者
*/
package cn.sxt.observer; public class ObserverA implements Observer{
private String myState;//自己的状态跟目标对象保持一致 @Override
public void update(Subject subject) {
myState=( (ConcreteSubject)subject ).getState();
} public String getMyState() {
System.out.print("系统消息:");
return myState;
} public void setMyState(String myState) {
this.myState = myState;
} }
【客户端】
/**
*
*/
package cn.sxt.observer; public class Client {
public static void main(String[] args) {
//目标对象,广播站
ConcreteSubject subject=new ConcreteSubject();
//3个观察者 听众
ObserverA obs1=new ObserverA();
ObserverA obs2=new ObserverA();
ObserverA obs3=new ObserverA(); //让这3个观察者添加到观察者容器中
subject.registerObserver(obs1);
subject.registerObserver(obs2);
subject.registerObserver(obs3); //改变状态 开始广播
subject.setState("明天上午8:00开会"); //看看观察者的状态
System.out.println(obs1.getMyState());
System.out.println(obs2.getMyState());
System.out.println(obs3.getMyState());
}
}
使用系统提供的观察类
【具体的广播站】
/***
* 一个具体的广播站 ,使用Java提供的 目标类java.util.Observable
*/
package cn.sxt.observer2; import java.util.Observable; public class ConcreteSubject extends Observable {
private String state; public void setState(String state) {
this.state = state;
setChanged();//调用jar的方法,表示目标对象已经做了更改
notifyObservers(state);//通知所有的观察者,jar包的方法
} public String getState() {
return state;
} }
【具体的听众】
/**
*
*/
package cn.sxt.observer2; import java.util.Observable;
import java.util.Observer; public class ObserverA implements Observer{//使用jar中的接口 private String myState; @Override
public void update(Observable o, Object arg) {//2个参数:主题对象
myState=( (ConcreteSubject) o).getState();
} public String getMyState() {
System.out.print("系统消息:");
return myState;
} public void setMyState(String myState) {
this.myState = myState;
} }
【客户端测试】
/**
*
*/
package cn.sxt.observer2; public class Client {
public static void main(String[] args) {
//目标对象,广播站
ConcreteSubject subject=new ConcreteSubject();
//3个观察者 听众
ObserverA obs1=new ObserverA();
ObserverA obs2=new ObserverA();
ObserverA obs3=new ObserverA(); //添加观察者
subject.addObserver(obs1);
subject.addObserver(obs2);
subject.addObserver(obs3); //改变状态 开始广播
subject.setState("明天上午9:00开会"); //看看观察者的状态
System.out.println(obs1.getMyState());
System.out.println(obs2.getMyState());
System.out.println(obs3.getMyState());
}
}
三、备忘录模式(memento)






【源发类】
/***
*源发器类 保存雇员的信息
*/
package cn.sxt.memento; public class Emp {
private String name;
private int age;
private double salary; //进行备忘操作
public EmpMemento memento() {
return new EmpMemento(this);//表示当前对象的信息
}
//进行数据恢复,恢复备忘录的值
public void recovery(EmpMemento mmt) {
this.name=mmt.getName();
this.age=mmt.getAge();
this.salary=mmt.getSalary();
} public Emp(String name, int age, double salary) {
super();
this.name = name;
this.age = age;
this.salary = salary;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public double getSalary() {
return salary;
} public void setSalary(double salary) {
this.salary = salary;
} }
【备忘录类】
/***
* 备忘录类
*/
package cn.sxt.memento; public class EmpMemento {
private String name;
private int age;
private double salary; public EmpMemento(Emp emp) {//传入源发器对象,即备忘谁的信息
this.name=emp.getName();//把雇员类的所有信息复制一遍给备忘录类
this.age=emp.getAge();
this.salary=emp.getSalary();
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public double getSalary() {
return salary;
} public void setSalary(double salary) {
this.salary = salary;
} }
【管理备忘录】
/***
* 负责人类,负责管理备忘录对象
*/
package cn.sxt.memento; import java.util.ArrayList;
import java.util.List; public class CareTaker {
private EmpMemento memento; //private List<EmpMemento>list =new ArrayList<EmpMemento>(); 可以存多个备忘录点,也可以搞搞个栈 public EmpMemento getMemento() {
return memento;
} public void setMemento(EmpMemento memento) {
this.memento = memento;
} }
【测试】
/**
*
*/
package cn.sxt.memento; public class Client {
public static void main(String[] args) {
CareTaker taker=new CareTaker();
Emp emp1=new Emp("Tom", 10, 7000);
System.out.println("原始的信息:"+emp1.getName()+"--"+emp1.getAge()+"--"+emp1.getSalary()); taker.setMemento(emp1.memento());//原始信息做了一次备份 emp1.setAge(18);
emp1.setSalary(9000);//对信息做了一次修改
System.out.println("修改后的信息:"+emp1.getName()+"--"+emp1.getAge()+"--"+emp1.getSalary()); emp1.recovery(taker.getMemento());//恢复信息到taker对象管理的备忘录点
System.out.println("恢复后的信息:"+emp1.getName()+"--"+emp1.getAge()+"--"+emp1.getSalary());
} }
[19/05/02-星期四] GOF23_行为型模式(状态模式、观察者模式、备忘录模式)的更多相关文章
- 《Android源码设计模式》--状态模式--责任链模式--解释器模式--命令模式--观察者模式--备忘录模式--迭代器模式
[状态模式] No1: Wifi设置界面是一个叫做WifiSetting的Fragment实现的 No2: 在不同的状态下对于扫描Wifi这个请求的处理是完全不一样的.在初始状态下扫描请求被直接忽略, ...
- 设计模式学习之备忘录模式(Memento,行为型模式)(19)
假如我们已经记录一个人的个人信息,但是发现信息写错了,然后我先备份下再去修改,结果发现原来的信息是正确的,于是我就看备份的个人信息还原到初始的状态,下面我们用代码去实现 class Program { ...
- C#设计模式之二十二备忘录模式(Memeto Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第十个模式,该模式是[备忘录模式],英文名称是:Memento Pattern.按老规矩,先从名称上来看看这个模式,个人的最初理解就 ...
- 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)
备忘录模式 Memento 沿着脚印,走过你来时的路,回到原点. 苦海翻起爱恨 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 一首<一生所爱>触动了多少 ...
- C#设计模式之二十二备忘录模式(Memento Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第十个模式,该模式是[备忘录模式],英文名称是:Memento Pattern.按老规矩,先从名称上来看看这个模式,个人的最初理解就是对某个对象的状态进行保 ...
- java设计模式--行为型模式--备忘录模式
备忘录模式,我们平常所做的备忘录么.还得深深研究哦. 备忘录模式: 备忘录模式 概述 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状 ...
- 设计模式20---设计模式之备忘录模式(Memento)(行为型)
1.讲解备忘录模式 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式. 1.1定义 在不破坏封 ...
- 设计模式(18)--Memento(备忘录模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. ...
- 行为型模式(十) 备忘录模式(Memento)
一.动机(Motivate) 我们看上图,一个对象肯定会有很多状态,这些状态肯定会相互转变而促进对象的发展,如果要想在某一时刻把当前对象回复到以前某一时刻的状态,这个情况用"备忘录模式&qu ...
- C#设计模式-备忘录模式
访问者模式的实现是把作用于某种数据结构上的操作封装到访问者中,使得操作和数据结构隔离.而本文要介绍的备忘者模式与命令模式有点相似,不同的是,命令模式保存的是发起人的具体命令(命令对应的是行为),而备忘 ...
随机推荐
- [javaEE] response实现图片下载
在Servlet中的doGet()方法中 获取FileInputStream对象,new出来,构造参数:String的文件路径 得到文件路径,调用this.getServletContext().ge ...
- webpack执行过程
webpack-cli 执行过程 1.webpack.config.js,shell options参数解析 2.new webpack(options) 3.run() 编译的入口方法 4.comp ...
- MySQL:SQL进阶
一.数据库相关理论 1.系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_s ...
- react项目跨域问题
在用知乎写demo的时候碰到了跨域问题 解决跨域如下: 跨域代理解决 "proxy":"https://news-at.zhihu.com", 请求的时候, ...
- JDBC中处理事务,小Demo
事务的四大特性(ACID): 原子性(Atomicity):事务中所有操作是不可再分割的原子单位.事务中所有操作要么全部执行成功,要么全部执行失败. 一致性(Consistency):事务执行 ...
- LintCode2016年算法比赛----二叉树的所有路径
二叉树的所有路径 题目描述 给定一棵二叉树,找从根节点到叶子节点的所有路径 样例 给出下面这课二叉树: 1 / \ 2 3 \ 5 所有根到叶子的路径为: [ "1->2->5& ...
- SP从32位系统到64位系统的迁移方法
前提:目标系统为64位1.在32位系统下正常安装SP,获取SP运行时必须的文件2.将[浪潮集团金融事业部]目录拷贝到目标系统的[C:\Program Files]目录3.进入目标系统的[浪潮集团金融事 ...
- PHP进阶知识总结
周末梳理了下这段时间看书的一些知识点,进步的过程不仅要实践,还要安排多看书.思考.总结. 只针对知识点进行了罗列和简单说明,很多细节还未整理好,待后面再专门详细写. 基础易忽略概念 PHP是一个支持面 ...
- Search Insert Position 查找给定元素在数组中的位置,若没有则返回应该在的位置
Given a sorted array and a target value, return the index if the target is found. If not, return the ...
- kernel update
CentOS/RHEL更新包:https://rhn.redhat.com/errata/RHSA-2017-1382.html yum makecache --更新源 yum update sudo ...