package com.jelly.mypattern.iterator;
/**
* 抽象聚集 定义接口
* @author jelly
*
*/
public interface Aggregate {
public Iterator iterator();
}
package com.jelly.mypattern.iterator;
/**
* 具体聚集
* @author jelly
*
*/
public class ConcreteAggregate implements Aggregate{
private Object[] objs=new Object[]{"aaa","bbb","ccc","ddd"};
@Override
public Iterator iterator() {
return new ConcreteIterator();
}
/**
*
* 在聚集对象的内部定义个 迭代子对象(也叫内禀迭代子)
* 实现迭代接口,提供给客户端一个迭代对象。
* @author jelly
*
*/
public class ConcreteIterator implements Iterator{
private int currentIndex=0;
//移动游标 到第一个元素
@Override
public void first() {
currentIndex=0;
}
//移动游标到下一个元素
@Override
public void next() {
if(currentIndex<objs.length){
currentIndex++;
}
}
//是否到了最后一个元素
@Override
public boolean isDone() {
return (currentIndex==objs.length);
}
//获取当前元素
@Override
public Object currentItem() {
return objs[currentIndex];
}
}
}
package com.jelly.mypattern.iterator;
/**
* 迭代接口
* @author jelly
*
*/
public interface Iterator {
//迭代方法 移动游标到第一个元素
public void first();
//迭代方法 移动游标到下一个元素
public void next();
//迭代方法 判断是否是最后一个元素
public boolean isDone();
//迭代方法 获取当前迭代到的元素
public Object currentItem();
}
package com.jelly.mypattern.iterator;
/**
* 客户端测试代码
* @author jelly
*
*/
public class IteratorTest {
public static void main(String[] args) {
Aggregate aggregate=new ConcreteAggregate();//得到聚集对象
Iterator it= aggregate.iterator();//调用聚集对象的iterator()方法 返回内部的一个迭代子对象。
//使用迭代子对象进行迭代 操作
while(!it.isDone()){
System.out.println(it.currentItem());
it.next();
}
}
}
package com.jelly.mypattern.memento;
/**
* 备忘录发起者
* @author jelly
*
*/
public class Originator {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public Originator() {
}
//创建备忘录
public MementoIF createMemento(){
System.out.println("备份我的状态:"+this.state);
return new Memento(this.state);
}
//恢复备忘录
public void restoreMemento(MementoIF mementoIF){
Memento memento=(Memento)mementoIF;
this.setState(memento.getSavedState());
System.out.println("恢复我的状态:"+this.getState());
}
/**
* 内部成员 内部类 备忘录
* @author jelly
*
*/
public class Memento implements MementoIF{
private String savedState;
public String getSavedState() {
return savedState;
}
public void setSavedState(String savedState) {
this.savedState = savedState;
}
public Memento(){
}
public Memento(String savedState){
this.savedState=savedState;
}
}
}
package com.jelly.mypattern.memento;
public interface MementoIF {
}
package com.jelly.mypattern.memento;
import java.util.Stack;
/**
* 备忘录负责人
* @author jelly
*
*/
public class CareTaker {
//备忘录栈
private Stack<MementoIF> memStack=new Stack<MementoIF>();
//每获取一个备忘录 出栈一次
public MementoIF getMemento(){
return memStack.pop();
}
//每存入一个备忘录 入栈一次
public void saveMemento(MementoIF memento){
memStack.push(memento);
}
}
package com.jelly.mypattern.memento;
/**
* 备忘录模式 测试代码
* @author jelly
*
*/
public class MementoTest {
public static void main(String[] args) {
Originator originator=new Originator();
CareTaker careTaker=new CareTaker();
//原始对象 状态变为了stateA
originator.setState("A");
System.out.println("我的状态变为了A");
//原对象 备份了自己状态(建立了一个备忘录),将备忘录交给careTaker去保存
careTaker.saveMemento(originator.createMemento());//创建备份,保存状态到careTaker的备忘录栈中
originator.setState("B");
System.out.println("我的状态变为了B");
careTaker.saveMemento(originator.createMemento());//创建备份,保存状态到careTaker的备忘录栈中
originator.setState("C");
System.out.println("我的状态变为了C");
careTaker.saveMemento(originator.createMemento());//创建备份,保存状态到careTaker的备忘录栈中
originator.setState("D");
System.out.println("我的状态变为了D");
originator.restoreMemento(careTaker.getMemento());//还原一次 状态为C
System.out.println("我的状态还原为了:"+originator.getState());
originator.restoreMemento(careTaker.getMemento());//再还原一次 状态为B
System.out.println("我的状态还原为了:"+originator.getState());
originator.restoreMemento(careTaker.getMemento());//再还原一次 状态为A
System.out.println("我的状态还原为了:"+originator.getState());
}
}
package com.jelly.mypattern.state;
/**
* tcp 连接对象 环境对象
* @author jelly
*
*/
public class TcpConnection {
public static final TcpState TCPSTATE_ESTABLISHED=new TcpEstablished();//具体状态对象
public static final TcpState TCPSTATE_LISTEN=new TcpListen();//具体状态对象
public static final TcpState TCPSTATE_CLOSED=new TcpClosed();//具体状态对象
private TcpState tcpState;//状态 接口
public TcpState getTcpState() {
return tcpState;
}
public void setTcpState(TcpState tcpState) {
this.tcpState = tcpState;
}
public void open(){
this.tcpState.open();
}
public void closed(){
this.tcpState.close();
}
public void ack(){
this.tcpState.ack();
}
}
package com.jelly.mypattern.state;
/**
* tcp 状态接口
* @author jelly
*
*/
public interface TcpState {
public void open();
public void close();
public void ack();
}
package com.jelly.mypattern.state;
/**
* tcp状态 连接已建立
* @author jelly
*
*/
public class TcpEstablished implements TcpState{
@Override
public void open() {
System.out.println("tcp连接已建立,不可重复建立");
}
@Override
public void close() {
System.out.println("tcp连接成功关闭");
}
@Override
public void ack() {
System.out.println("tcp连接已建立,无须ack操作");
}
}
package com.jelly.mypattern.state;
/**
* tcp状态 监听中
* @author jelly
*
*/
public class TcpListen implements TcpState{
@Override
public void open() {
System.out.println("tcp连接建立成功");
}
@Override
public void close() {
System.out.println("tcp已挂监听");
}
@Override
public void ack() {
System.out.println("tcp ack确认成功");
}
}
package com.jelly.mypattern.state;
/**
* tcp状态 连接已关闭
* @author jelly
*
*/
public class TcpClosed implements TcpState{
@Override
public void open() {
throw new IllegalAccessError("非法的访问,连接已关闭");
}
@Override
public void close() {
System.out.println("tcp连接已关闭");
}
@Override
public void ack() {
throw new IllegalAccessError("非法的访问,连接已关闭");
}
}
package com.jelly.mypattern.state;
/**
* 状态模式测试 类
* @author jelly
*
*/
public class StateTest {
public static void main(String[] args) {
TcpConnection conn=new TcpConnection();
conn.setTcpState(TcpConnection.TCPSTATE_LISTEN);
conn.open();
conn.setTcpState(TcpConnection.TCPSTATE_ESTABLISHED);
conn.closed();
conn.setTcpState(TcpConnection.TCPSTATE_CLOSED);
conn.open();//由于tcp连接已关闭,调用open()方法将抛出异常 。
}
}
package com.jelly.mypattern.command;
/**
* 命令发起人
* @author jelly
*
*/
public class Invoker {
private Command command;
public Invoker(Command command){
this.command=command;
}
public void action(){
command.execute();
}
}
package com.jelly.mypattern.command;
/**
* 抽象命令接口
* @author jelly
*
*/
public interface Command {
public void execute();
}
具体命令ConcreteCommand
package com.jelly.mypattern.command;
/**
* 具体命令
* @author jelly
*
*/
public class ConcreteCommand implements Command{
//命令接收者
private Receiver receiver;
public ConcreteCommand(Receiver receiver) {
this.receiver=receiver;
}
@Override
public void execute() {
receiver.action();//接收者执行命令
}
}
package com.jelly.mypattern.command;
/**
* 命令接收者 执行者
* @author jelly
*
*/
public class Receiver {
public Receiver() {
super();
}
public void action(){
System.out.println("命令 已被执行。。。");
}
}
package com.jelly.mypattern.command;
/**
* 命令模式 测试代码
* @author jelly
*
*/
public class CommandTest {
public static void main(String[] args) {
Receiver receiver=new Receiver();
//命令对象, 指定命令的接收者
Command command =new ConcreteCommand(receiver);
//调用者发出一道命令,这道命令由一个命令对象封装表示
Invoker invoker=new Invoker(command);
invoker.action();
}
}
上一篇:java设计模式(五)
下一篇:java设计模式(七)


阅读排行


Copyright © 叮叮声的奶酪 版权所有
备案号:鄂ICP备17018671号-1