当前位置:  编程技术>软件工程/软件设计
本页文章导读:
    ▪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]、
    
[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 查看评论

    
最新技术文章:
▪主-主数据库系统架构    ▪java.lang.UnsupportedClassVersionError: Bad version number i...    ▪eclipse项目出现红色叉叉解决方案
▪Play!framework 项目部署到Tomcat    ▪dedecms如何做中英文网站?    ▪Spring Batch Framework– introduction chapter(上)
▪第三章 AOP 基于@AspectJ的AOP    ▪基于插件的服务集成方式    ▪Online Coding开发模式 (通过在线配置实现一个表...
▪机器学习理论与实战(二)决策树    ▪Hibernate(四)——全面解析一对多关联映射    ▪我所理解的设计模式(C++实现)——解释器模... iis7站长之家
▪机器学习理论与实战(二)决策树    ▪Hibernate(四)——全面解析一对多关联映射    ▪我所理解的设计模式(C++实现)——解释器模...
▪利用规则引擎打造轻量级的面向服务编程模式...    ▪google blink的设计计划: Out-of-Progress iframes    ▪FS SIP呼叫的消息线程和状态机线程
▪XML FREESWITCH APPLICATION 实现    ▪Drupal 实战    ▪Blink: Chromium的新渲染引擎
▪(十四)桥接模式详解(都市异能版)    ▪你不知道的Eclipse用法:使用Allocation tracker跟...    ▪Linux内核-进程
▪你不知道的Eclipse用法:使用Metrics 测量复杂度    ▪IT行业为什么没有进度    ▪Exchange Server 2010/2013三种不同的故障转移
▪第二章 IoC Spring自动扫描和管理Bean    ▪CMMI简介    ▪目标检测(Object Detection)原理与实现(六)
▪值班总结(1)——探讨sql语句的执行机制    ▪第二章 IoC Annotation注入    ▪CentOS 6.4下安装Vagrant
▪Java NIO框架Netty1简单发送接受    ▪漫画研发之八:会吃的孩子有奶吃    ▪比较ASP和ASP.NET
▪SPRING中的CONTEXTLOADERLISTENER    ▪在Nginx下对网站进行密码保护    ▪Hibernate从入门到精通(五)一对一单向关联映...
▪.NET领域驱动设计—初尝(三:穿过迷雾走向光...    ▪linux下的块设备驱动(一)    ▪Modem项目工作总结
▪工作流--JBPM简介及开发环境搭建    ▪工作流--JBPM核心服务及表结构    ▪Eclipse:使用JDepend 进行依赖项检查
▪windows下用putty上传文件到远程Linux方法    ▪iBatis和Hibernate的5点区别    ▪基于学习的Indexing算法
▪设计模式11---设计模式之中介者模式(Mediator...    ▪带你走进EJB--JMS编程模型    ▪从抽象谈起(二):观察者模式与回调
▪设计模式09---设计模式之生成器模式(Builder)也...    ▪svn_resin_持续优化中    ▪Bitmap recycle方法与制作Bitmap的内存缓存
▪Hibernate从入门到精通(四)基本映射    ▪设计模式10---设计模式之原型模式(Prototype)    ▪Dreamer 3.0 支持json、xml、文件上传
▪Eclipse:使用PMD预先检测错误    ▪Jspx.net Framework 5.1 发布    ▪从抽象谈起(一):工厂模式与策略模式
▪Eclipse:使用CheckStyle实施编码标准    ▪【论文阅读】《Chain Replication for Supporting High T...    ▪Struts2 Path_路径问题
▪spring 配置文件详解    ▪Struts2第一个工程helloStruts极其基本配置    ▪Python学习入门基础教程(learning Python)--2 Python简...
▪maven springmvc环境配置    ▪基于SCRUM的金融软件开发项目    ▪software quality assurance 常见问题收录
▪Redis集群明细文档    ▪Dreamer 框架 比Struts2 更加灵活    ▪Maven POM入门
▪git 分支篇-----不断更新中    ▪Oracle非主键自增长    ▪php设计模式——UML类图
▪Matlab,Visio等生成的图片的字体嵌入问题解决...    ▪用Darwin和live555实现的直播框架    ▪学习ORM框架—hibernate(二):由hibernate接口谈...
▪(十)装饰器模式详解(与IO不解的情缘)    ▪无锁编程:最简单例子    ▪【虚拟化实战】网络设计之四Teaming
▪OSGi:生命周期层    ▪Javascript/Jquery——简单定时器    ▪java代码 发送GET、POST请求
▪Entity Framework底层操作封装(3)    ▪HttpClient 发送GET、POST请求    ▪使用spring框架,应用启动时,加载数据
▪Linux下Apache网站目录读写权限的设置    ▪单键模式的C++描述    ▪学习ORM框架—hibernate(一):初识hibernate
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3