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