当前位置: 编程技术>软件工程/软件设计
本页文章导读:
▪vi/vim常用命令,vi/vim正则表达式
一、Unix编辑器概述
编辑器是使用计算机的重要工具之一,在各种操作系统中,编辑器都是必不可少的部件。Unix及其相似的ix操作系统系列中,为方便各种用户在.........
▪学过DRP再看设计模式之 抽象工厂(BeanFactory) 将BeanFactory保存在ServletContext中,ServletContext充当Web和业务逻辑的桥梁
统一工厂创建和管理对象
利用抽象工厂+单例+反射实现
BeanFactory.java
/**
* 抽象工厂
* 采用单例
* @author TCH
*
*.........
▪学过DRP再看设计模式之 工厂 工厂用来隐藏产品创建细节
简单工厂
好处:客户不用知道具体电视——长虹
的组装过程,是在工厂内部完成创建电视过程的。
不足:增加电视,需要修改工厂,增加if语句或者switch分.........
[1]vi/vim常用命令,vi/vim正则表达式
来源: 互联网 发布时间: 2013-11-19
一、Unix编辑器概述
编辑器是使用计算机的重要工具之一,在各种操作系统中,编辑器都是必不可少的部件。Unix及其相似的ix操作系统系列中,为方便各种用户在各个不同的环境中使用,提供了一系列的ex编辑器,包括
ex, edit,ed和 vi.其中ex,edit,ed都是行编辑器,现在已很少有人使用,Unix提供他们的原因是考虑到满足各种用户特别是某些终端用户的需要。值得庆幸的是,Unix提供了全屏幕的Vi编辑器,这使我们的工作轻松不少。不少DOS用户抱怨Vi编辑器不象
DOS下的编辑器如edit那么好用,这是因为Vi考虑到各种用户的需要,没有使用某些通用的编辑键(在各个不同的终端机上他们的定义是不同的,在某些终端机上甚至没有这些键)。而是采用状态切换的方法,但这只是习惯的问题,一旦你熟练的使用上了vi你就会觉得它其实也很好用。
虽然 Vi采用了状态切换的方法,但电脑的硬件及操作系统多种多样,某些电脑的键盘上没有特定的几个功能键!那麽不就有某些功能不能用了?这个问题在
Unix 系统上也一样,几乎各大电脑厂商都有自己的 Unix系统,而 vi的操作方法也会随之有点出入。这里我们采用
PC的键盘来说明 vi的操作,但在具体的环境中还要参考相应的资料,这一点是值得注意的。
二、Vi入门 2.1 进入vi 在系统提示字符(如$、#)下敲入vi<档案名称>,vi可以自动帮你载入所要编辑的文件或是开启一个新文件(如果该文件不存在或缺少文件名)。进入 vi后萤幕左方会出现波浪符号,凡是列首有该符号就代表此列目前是空的。
2.2 两种模式 如上所述,vi存在两种模式:指令模式和输入模式。在指令模式下输入的按键将做为指令来处理:如输入 a,vi即认为是在当前位置插入字符。而在输入模式下,vi则把输入的按键当作插入的字符来处理。指令模式切换到输入模式只需键入相应的输入命令即可(如a,A),而要从输入模式切换到指令模式,则需在输入模式下键入ESC键,如果不晓得现在是处於什麽模式,可以多按几次 [ESC],系统如发出哔哔声就表示已处于指令模式下了。
付:在指令模式进入输入模式的指令:
新增 (append)
a :从光标所在位置後面开始新增资料,光标後的资料随新增资料向後移动。
A:从光标所在行最後面的地方开始新增资料。
插入 (insert)
i:从光标所在位置前面开始插入资料,光标後的资料随新增资料向後移动。
I :从光标所在行的第一个非空白字元前面开始插入资料。
开始 (open)
o :在光标所在行下新增一行并进入输入模式。
O: 在光标所在行上方新增一行并进入输入模式。
2.3 退出vi 在指令模式下键入:q,:q!,:wq或:x(注意:号),就会退出vi。其中:wq和:x是存盘退出,而:q是直接退出,如果文件已有新的变化,vi会提示你保存文件而:q命令也会失效,这时你可以用:w命令保存文件后再用:q退出,或用:wq或:x命令退出,如果你不想保存改变后的文件,你就需要用:q!命令,这个命令将不保存文件而直接退出vi。
2.4 基本编辑 配合一般键盘上的功能键,像是方向键、[Insert]、
二、Vi入门 2.1 进入vi 在系统提示字符(如$、#)下敲入vi<档案名称>,vi可以自动帮你载入所要编辑的文件或是开启一个新文件(如果该文件不存在或缺少文件名)。进入 vi后萤幕左方会出现波浪符号,凡是列首有该符号就代表此列目前是空的。
2.2 两种模式 如上所述,vi存在两种模式:指令模式和输入模式。在指令模式下输入的按键将做为指令来处理:如输入 a,vi即认为是在当前位置插入字符。而在输入模式下,vi则把输入的按键当作插入的字符来处理。指令模式切换到输入模式只需键入相应的输入命令即可(如a,A),而要从输入模式切换到指令模式,则需在输入模式下键入ESC键,如果不晓得现在是处於什麽模式,可以多按几次 [ESC],系统如发出哔哔声就表示已处于指令模式下了。
付:在指令模式进入输入模式的指令:
新增 (append)
a :从光标所在位置後面开始新增资料,光标後的资料随新增资料向後移动。
A:从光标所在行最後面的地方开始新增资料。
插入 (insert)
i:从光标所在位置前面开始插入资料,光标後的资料随新增资料向後移动。
I :从光标所在行的第一个非空白字元前面开始插入资料。
开始 (open)
o :在光标所在行下新增一行并进入输入模式。
O: 在光标所在行上方新增一行并进入输入模式。
2.3 退出vi 在指令模式下键入:q,:q!,:wq或:x(注意:号),就会退出vi。其中:wq和:x是存盘退出,而:q是直接退出,如果文件已有新的变化,vi会提示你保存文件而:q命令也会失效,这时你可以用:w命令保存文件后再用:q退出,或用:wq或:x命令退出,如果你不想保存改变后的文件,你就需要用:q!命令,这个命令将不保存文件而直接退出vi。
2.4 基本编辑 配合一般键盘上的功能键,像是方向键、[Insert]、
[2]学过DRP再看设计模式之 抽象工厂(BeanFactory)
来源: 互联网 发布时间: 2013-11-19
将BeanFactory保存在ServletContext中,ServletContext充当Web和业务逻辑的桥梁
统一工厂创建和管理对象
利用抽象工厂+单例+反射实现
BeanFactory.java
/** * 抽象工厂 * 采用单例 * @author TCH * */ publicclass BeanFactory { privatestatic BeanFactory instance = new BeanFactory(); //系统缺省配置文件名称 privatefinal String beansConfigFile = "beans-config.xml"; Documentdoc = null; /* * key=配置文件中的id值 * value=对应了改Id的对象 */ MapserviceMap = new HashMap<String, Object>(); MapdaoMap = new HashMap<String, Object>(); privateBeanFactory(){ //加载beans-config.xml文件 try{ doc= newSAXReader().read(Thread.currentThread().getContextClassLoader().getResourceAsStream(beansConfigFile)); }catch (DocumentException e) { e.printStackTrace(); thrownew RuntimeException(); } } publicstatic BeanFactory getInstance(){ returninstance; } /** * 根据产品编号取得具体的Service产品 * @param beanId * @return */ publicsynchronized Object getServiceObject(Class c){ //如果存在对应对象实例,返回 if(serviceMap.containsKey(c.getName())) { returnserviceMap.get(c.getName()); } ElementbeanElt = (Element)doc.selectSingleNode("//service[@id=\"" +c.getName() +"\"]"); StringclassName = beanElt.attributeValue("class"); System.out.print(className); ObjectserviceObj = null; try{ serviceObj= Class.forName(className).newInstance(); //利用动态代理模式创建代理 TransactionHandlertransactionHandler = new TransactionHandler(); serviceObj= transactionHandler.newProxyInstance(serviceObj); serviceMap.put(c.getName(),serviceObj); }catch (Exception e) { e.printStackTrace(); thrownew RuntimeException(); } returnserviceObj; } /** * 根据产品编号取得具体的Dao产品 * @param beanId * @return */ publicsynchronized Object getDaoObject(Class c){ //如果存在对应对象实例,返回 if(daoMap.containsKey(c.getName())) { returndaoMap.get(c.getName()); } ElementbeanElt = (Element)doc.selectSingleNode("//dao[@id=\"" +c.getName() +"\"]"); StringclassName = beanElt.attributeValue("class"); System.out.print(className); ObjectdaoObj = null; try{ daoObj= Class.forName(className).newInstance(); daoMap.put(c.getName(),daoObj); }catch (Exception e) { e.printStackTrace(); thrownew RuntimeException(); } returndaoObj; } publicstatic void main(String[] args){ System.out.print(BeanFactory.class); } }
Service、Dao层的接口和实现类配置信息
beans-config.xml
<?xmlversion="1.0" encoding="UTF-8"?> <beans> <service-class> <serviceid="com.java.drp.basedata.manager.ItemManager"class="com.java.drp.basedata.manager.ItemManagerImpl"/> <serviceid="com.java.drp.flowcard.manager.FlowCardManager"class="com.java.drp.flowcard.manager.FlowCardManagerImp"/> <serviceid="com.java.drp.statreport.manager.StatReportManager"class="com.java.drp.statreport.manager.StatReportManagerImp"/> </service-class> <dao-class> <daoid="com.java.drp.basedata.dao.ItemDao"class="com.java.drp.basedata.dao.ItemDao4Oracle"/> <daoid="com.java.drp.flowcard.dao.FlowCardDao"class="com.java.drp.flowcard.dao.FlowCardDao4Oracle"/> </dao-class> </beans>
抽象Servlet公共部分:command、User、BeanFactory
BaseServlet.java
publicclass BaseServlet extends HttpServlet { privateString command; privateUser user; privateBeanFactory beanFactory; @Override protectedfinal void service(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { command= request.getParameter("command"); user= (User)request.getSession().getAttribute("user_info"); super.service(request,response); } protectedString getCommand() { returncommand; } protectedUser getCurrentUser() { returnuser; } protectedBeanFactory getBeanFactory() { //从ServletContext中取得BeanFactory beanFactory= (BeanFactory)this.getServletContext().getAttribute("beanFactory"); returnbeanFactory; } }
应用:物料维护Servlet,使用BeanFactory创建对象
FlowCardServlet.java
/** * 物料维护Servlet * @author Administrator * */ publicclass FlowCardServlet extends BaseServlet { privateFlowCardManager flowCardManager; @Override publicvoid init() throws ServletException { flowCardManager= (FlowCardManager)getBeanFactory().getServiceObject(FlowCardManager.class); // TransactionHandlertransactionHandler = new TransactionHandler(); // //对目标生成代理对象 // flowCardManager= (FlowCardManager)transactionHandler.newProxyInstance(flowCardManager); } @Override protectedvoid doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { if(Constants.DEL.equals(getCommand())) { del(request,response); }else { search(request,response); } } @Override protectedvoid doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { doGet(request,response); } /** * 删除 * @param request * @param response * @throws ServletException * @throws IOException */ privatevoid del(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { String[]flowCardVouNos = request.getParameterValues("selectFlag"); flowCardManager.delFlowCard(flowCardVouNos); response.sendRedirect(request.getContextPath()+ "/servlet/flowcard/FlowCardServlet"); }
作者:tcl_6666 发表于2013-5-14 11:16:42 原文链接
阅读:0 评论:0 查看评论
[3]学过DRP再看设计模式之 工厂
来源: 互联网 发布时间: 2013-11-19
工厂用来隐藏产品创建细节
简单工厂
好处:客户不用知道具体电视——长虹 的组装过程,是在工厂内部完成创建电视过程的。
不足:增加电视,需要修改工厂,增加if语句或者switch分支,又得对稳定代码重新测试。
工厂方法
好处:
对简单工厂中的工厂继续划分职责,从而很好的支持OCP原则 开放扩展,关闭修改
适合单一系列产品的创建
不足:
如果是多个系列产品,也就是有多个工厂
选择判断问题依然存在,客户端需要决定实例化哪一个工厂。
如果再增加洗衣机等,会增加很多类。
抽象工厂
优点:
对产品的增加支持OCP原则
可用于多个系列产品的创建
缺点:
如果增加一个系列,至少增加三个类,比如洗衣机接口、洗衣机型号一、洗衣机型号二,还需要修改 工厂接口、型号一工厂、型号二工厂。(对产品系列的增加不支持OCP原则)
利用反射改善
class 工厂 { //命名空间 private static readonly string AssemblyName = "抽象工厂"; // 从xml中读取equip值:电视机/笔记本 private static readonly string equip = ConfigurationManager.AppSettings["equip"];; public static 电视机 生产电视机() { //字符串: 抽象工厂.电视机型号* string classname = AssemblyName + "." + "电视机" + equip; //反射,返回电视机类型的 电视机型号* 类的实例 return (IUser)Assembly.Load(AssemblyName).CreateInstance(classname); } public static 笔记本 生产笔记本() { //字符串: 抽象工厂.笔记本型号* string classname = AssemblyName + "." + "笔记本" +equip; //反射,返回电视机类型的 笔记本型号* 类的实例 return (IUser)Assembly.Load(AssemblyName).CreateInstance(classname); } }
这个工厂是由简单工厂进化而来,虽然switch和if是程序里的好东西,但是应对变化上,却显得老态龙钟。反射技术却可以很好地解决他们难以应对变化,难以维护,对修改开放的诟病。
小结
简单工厂到工厂方法,再到抽象工厂,是以灵活变化为主线逐步改善。不过在获得应对变化能力的同时,却以工作量大,效率为代价。所以运用哪种模式,还要根据具体情景,并不是简单工厂无用武之地,并不是运用抽象工厂就是最优。
作者:tcl_6666 发表于2013-5-14 11:12:16 原文链接
阅读:0 评论:0 查看评论
最新技术文章:
 
站内导航:
特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!