设计模式 随笔(一)
2015-06-28 20:37
232 查看
命令模式,active object模式:
需要一个执行引擎,一个执行接口(规约),若干个实现类。
如 开关 后边接 电扇--》电扇开关
接电视:电视开关
空调:空调开关
开关(引擎并不知道要做什么),由后边的电器实现。也就意味着,电器要实现可开关接口。
可以实现多线程,通过控制条件如时间。RTC线程。通过返回非空对象实现do 和 undo。
public void execute();
public object do();
public object undo();
package advanceobject;
import java.util.LinkedList;
public class ActiveObjectEngine {
LinkedList itsCommands = new LinkedList();
public void addCommand(Command c){
itsCommands.add(c);
}
public void run() throws Exception{
while(!itsCommands.isEmpty()){
Command c=(Command) itsCommands.getFirst();
itsCommands.removeFirst();
c.execute();
}
}
}
需要一个执行引擎,一个执行接口(规约),若干个实现类。
如 开关 后边接 电扇--》电扇开关
接电视:电视开关
空调:空调开关
开关(引擎并不知道要做什么),由后边的电器实现。也就意味着,电器要实现可开关接口。
可以实现多线程,通过控制条件如时间。RTC线程。通过返回非空对象实现do 和 undo。
public void execute();
public object do();
public object undo();
package advanceobject;
import java.util.LinkedList;
public class ActiveObjectEngine {
LinkedList itsCommands = new LinkedList();
public void addCommand(Command c){
itsCommands.add(c);
}
public void run() throws Exception{
while(!itsCommands.isEmpty()){
Command c=(Command) itsCommands.getFirst();
itsCommands.removeFirst();
c.execute();
}
}
}
package advanceobject; public interface Command { public void execute() throws Exception; }
package advanceobject; public class SleepCommand implements Command { private Command wakeupCommand = null; private ActiveObjectEngine engine=null; private long sleepTime = 0; private long startTime = 0; private boolean started = false; private String objectname=null; private int count=0; public SleepCommand(Command wakeupCommand, ActiveObjectEngine engine, long sleepTime,String objname) { super(); this.wakeupCommand = wakeupCommand; this.engine = engine; this.sleepTime = sleepTime; this.objectname=objname; } @Override public void execute() throws Exception { // TODO Auto-generated method stub long currentTime = System.currentTimeMillis(); if(!started){ System.out.println("Init control flag and ready to run"); started = true; startTime=currentTime; engine.addCommand(this); } else if((currentTime-startTime)<sleepTime){ System.out.println("Running do some business before condition is false "+objectname+" times "+count); count++; engine.addCommand(this); } else { System.out.println("Time out add exit into loop"); if(null!=wakeupCommand) engine.addCommand(wakeupCommand); } } }
package advanceobject; public class TestMain { public static void main(String[] args){ Command wakeup = null; ActiveObjectEngine e=new ActiveObjectEngine(); SleepCommand c1=new SleepCommand(wakeup,e,10,"c1"); e.addCommand(c1); SleepCommand c2=new SleepCommand(wakeup,e,10,"c2"); e.addCommand(c2); SleepCommand c3=new SleepCommand(wakeup,e,10,"c3"); e.addCommand(c3); SleepCommand c4=new SleepCommand(wakeup,e,10,"c4"); e.addCommand(c4); try { e.run(); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }
相关文章推荐
- SpringMVC通过@autowired自动装载Service时提示装载错误
- 字符串-mutableString
- COM中的线程模式
- COM中的线程模式
- oracle创建存储过程并返回结果集(附C#调用代码)
- android 制作倒计时遇到的问题小结
- POJ3461KMP
- 远程通信(RPC,Webservice,RMI,JMS、EJB、JNDI的区别)对比
- 项目解决方案:解压app — 写入文件 — 压缩app — jarsigner重新签名app — 安装app
- 写给想要做自动化测试的人
- 关于互联网的一些看过或正在看的好的资料
- bluestacks手机模拟器安装qq或微信时,鼠标左键点聊天编辑框后会自动输入 c 字母
- Windows server 2008 R2访问文件权限设置
- Ubuntu怎么卸载vmware
- 学习单例模式
- spring中自定义属性编辑器CustomEditorConfigurer
- java垃圾回收算法
- 编写网络程序
- Xilinx实习一年总结
- CAS简介