一、状态模式

【状态接口】

/***
* 房间"状态"接口
*/
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_行为型模式(状态模式、观察者模式、备忘录模式)的更多相关文章

  1. 《Android源码设计模式》--状态模式--责任链模式--解释器模式--命令模式--观察者模式--备忘录模式--迭代器模式

    [状态模式] No1: Wifi设置界面是一个叫做WifiSetting的Fragment实现的 No2: 在不同的状态下对于扫描Wifi这个请求的处理是完全不一样的.在初始状态下扫描请求被直接忽略, ...

  2. 设计模式学习之备忘录模式(Memento,行为型模式)(19)

    假如我们已经记录一个人的个人信息,但是发现信息写错了,然后我先备份下再去修改,结果发现原来的信息是正确的,于是我就看备份的个人信息还原到初始的状态,下面我们用代码去实现 class Program { ...

  3. C#设计模式之二十二备忘录模式(Memeto Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第十个模式,该模式是[备忘录模式],英文名称是:Memento Pattern.按老规矩,先从名称上来看看这个模式,个人的最初理解就 ...

  4. 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)

    备忘录模式 Memento   沿着脚印,走过你来时的路,回到原点.     苦海翻起爱恨   在世间难逃避命运   相亲竟不可接近   或我应该相信是缘份   一首<一生所爱>触动了多少 ...

  5. C#设计模式之二十二备忘录模式(Memento Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第十个模式,该模式是[备忘录模式],英文名称是:Memento Pattern.按老规矩,先从名称上来看看这个模式,个人的最初理解就是对某个对象的状态进行保 ...

  6. java设计模式--行为型模式--备忘录模式

    备忘录模式,我们平常所做的备忘录么.还得深深研究哦. 备忘录模式: 备忘录模式 概述 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状 ...

  7. 设计模式20---设计模式之备忘录模式(Memento)(行为型)

    1.讲解备忘录模式 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式. 1.1定义 在不破坏封 ...

  8. 设计模式(18)--Memento(备忘录模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. ...

  9. 行为型模式(十) 备忘录模式(Memento)

    一.动机(Motivate) 我们看上图,一个对象肯定会有很多状态,这些状态肯定会相互转变而促进对象的发展,如果要想在某一时刻把当前对象回复到以前某一时刻的状态,这个情况用"备忘录模式&qu ...

  10. C#设计模式-备忘录模式

    访问者模式的实现是把作用于某种数据结构上的操作封装到访问者中,使得操作和数据结构隔离.而本文要介绍的备忘者模式与命令模式有点相似,不同的是,命令模式保存的是发起人的具体命令(命令对应的是行为),而备忘 ...

随机推荐

  1. 撩课-Python-每天5道面试题-第8天

    一. 解释下什么是闭包? 有怎样的场景作用? 概念 在函数嵌套的前提下 内层函数引用了外层函数的变量(包括参数) 外层函数, 又把 内层函数 当做返回值进行返回 这个内层函数+所引用的外层变量, 称为 ...

  2. python模块之numpy与pandas

    一.numpy numpy是python数据分析和机器学习的基础模块之一.它有两个作用:1.区别于list列表,提供了数组操作.数组运算.以及统计分布和简单的数学模型:2.计算速度快[甚至要由于pyt ...

  3. 解决:IDEA 中 new Java Class 怎么没了?

    前言:写代码时遇到的问题,所以记录下来.我的包名为“interface”,只有这个包及包下的文件不能建java文件. 问题 解决方式(对于普通包名) 点击应用,ok就可以了. 解决方式(对于包名为“i ...

  4. 循环遍历正则验证input框内容合法性

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. Asp.Net实现在线网站安装(上)

    在很多年前,笔者在使用z-blog搭建个人部落格的时候,最大的感受就是z-blog在线安装功能! 因为在那个时候,以几K每秒的速度上传一个几M或者十几M的压缩包到虚拟主机上,是一个很痛苦的事情.特别是 ...

  6. 原生Ajax(XMLHttpRequest)

    一.什么是Ajax: 全称Asynchronous JavaScript and XML: 异步的 JavaScript 和 XML: 可以在不重新加载整个页面的情况下(偷偷发数据),与服务器交换数据 ...

  7. Struts22222

    一,什么是框架?  所谓框架就是提供了一组统一的接口和编程方式的可以重用组件,同时我们可以在框架中扩充我们自己的特定逻辑. 二,MVC设计模式 将应用程序分为3个部分:模型 Model,视图View, ...

  8. Node.js 的安装

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 的运行环境,简单的说就是运行在服务端的 JavaScript.所以学起来还是比较容易接受的. Node.js 使用事件驱动 ...

  9. web测试流程的总结及关注点

    项目的测试流程大只包含的几个阶段:立项.需求评审.用例评审.测试执行.测试报告文档 一.立项后测试需要拿到的文档 1.需求说明书 2.原型图(及UI图) 3.接口文档 4.数据库字典(表的数量.缓存机 ...

  10. UX基础 - OmniGraffle新手指南

    原文地址:http://beforweb.com/node/202,大半夜找到,作为使用手册 我发现一事儿,就是最近这些年,每到入职一个新公司的时候,听得东西往往会比多数时候听得更重更金属些,此时以S ...