Skip to Main Content

Chinese

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

工作中实际用到的设计模式

702619Mar 30 2004 — edited Oct 19 2007
工作中实际用到的设计模式
2.4,一些设计模式的实现
2.4.1 Facade模式
Facade模式为子系统中的一组接口提供一个一致的界面,它定义了一个高层接口,这个接口使得这一子系统更加容易使用。当要为一个复杂子系统提供一个简单接口时,子系统往往因为不断演化而变得越来越复杂,大多数模式使用时都会产生更多更小的类,这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的缺省视图。客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。 当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过Facade进行通讯,从而简化了它们之间的依赖关系。
/**
**
*** 在处理审批流程只要new FcdBizCheck出来,其它具体的事情和调用别的类都由FcdBizCheck搞定
**
**/
FcdBizCheck fcdBizCheck=new FcdBizCheck();
……
int agree_result=fcdBizCheck.approve(login.userId,eventId,checkId,checkNode,Opinion_frm_pg,enddate,MemCode);
if(agree_result>0)
{
out.println("<script>alert('同意成功!');</script>");
response.sendRedirect("main.jsp");
}
else {
out.println("<script>alert('同意不成功!');</script>");
}
}
/**
*** 具体的事情和调用别的类都由FcdBizCheck搞定
**/

public class FcdBizCheck {

private int m_eventid;
.........
/*
受理新业务
*/
public int accept(......) {
.........
}

/* 审核通过 * */
public int approve(......) {
.........
//设置注销申请为预注销状态!!!
........
//执行转移任务,将临时转移到正式表!!!
.......
//调用approve方法,完成event,check修改
.......
}

/* 审核不通过* */
public int reject(......) {
.......
}

/* 保存审核记录* */
public int save(......) {
BizCheck bcheck = new BizCheck();
return bcheck.save(userid,eventid,checkid,opinion,memcode);
}
.......
}
2.4.2 Factory模式
Factory模式利用给Factory对象传递不同的参数,以返回具有相同基类或实现了同一接口的对象。简单工厂(Simple Factory)模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式。这种模式根据外界给定的信息,由"工厂"对象"制造"出某些可能"产品"类中的一个实例,工厂对象能够处理的所有类通常都继承于同一个父类,并且对外界提供基本相同的接口,只不过在具体实现时会有所差别罢了。
下面是本系统中NotiMtnFact类根据不同的参数创建不同的NotiMtn实例的工厂方法的类图。


/** 代码如下**/
public class NotiMtnFact {
……..
public NotiMtn getNotiMtn(String type)
/** 工厂 **/
{
…….

if(type.equals("accept"))
{ notiMtn=new AcceptNotiMtn();
}
if(type.equals("bizCheck"))
{ notiMtn=new BizCheckNotiMtn();
}
if(type.equals("file"))
{ notiMtn=new FileNotiMtn();
}
if(type.equals("risk"))
{ notiMtn=new RiskNotiMtn();
}
………
return notiMtn;
}

2.4.3 Composite模式
composite模式将对象组合成树形结构以表示"部分-整体"层次结构。Composite使组合对象的使用和单个对象的使用具有一致性。composite模式经常和Iterator模式一起使用。
2.4.4 Iterator模式
Iterator模式用来规格化对某一数据结构的遍历接口。
JDK中在Collection Framework中引入了Iterator接口,提供对一个Collection的遍历。每一个Collection类中都定义有从Collection接口中继承而来的iterator()方法,来得到一个Iterator对象,称为遍历器,Iterator接口很简单:
hasNext():用来判断在遍历器中是否还有下一个元素。
next():返回遍历器中的下一个元素。
remove():在被遍历的Collection类中删除最后被返回的那个对象。
本项目中有这样一段代码
try{
NotiMtn acceptNotiMtn=notiMtnFact.getNotiMtn("accept");
acceptNotiMtn.createNewNoti();
System.out.println("生成 accept noti成功!");
} catch(Exception e)
{
op_flag=false;
System.out.println("生成 accept noti不成功!");
}
try{
NotiMtn canelNotiMtn=notiMtnFact.getNotiMtn("cancel");
canelNotiMtn.createNewNoti();
System.out.println("生成 cancel noti成功!");
} catch(Exception e)
{
op_flag=false;
System.out.println("生成 cancel noti不成功!");
}
try{
NotiMtn riskNotiMtn=notiMtnFact.getNotiMtn("risk");
riskNotiMtn.createNewNoti();
System.out.println("生成 risk noti成功!");
} catch(Exception e)
{
op_flag=false;
System.out.println("生成 risk noti不成功!");
}
try{
NotiMtn fileNotiMtn=notiMtnFact.getNotiMtn("file");
fileNotiMtn.createNewNoti();
System.out.println("生成 file noti成功!");
} catch(Exception e)
{
op_flag=false;
System.out.println("生成 file noti不成功!");
}
try{
NotiMtn bizcheckNotiMtn=notiMtnFact.getNotiMtn("bizCheck");
bizcheckNotiMtn.createNewNoti();
System.out.println("生成 bizCheck noti成功!");
} catch(Exception e)
{
op_flag=false;
System.out.println("生成 bizCheck noti不成功!");
}
try{
NotiMtn assureNotiMtn=notiMtnFact.getNotiMtn("assure");
assureNotiMtn.createNewNoti();
System.out.println("生成 assure noti成功!");
} catch(Exception e)
{
op_flag=false;
System.out.println("生成 assure noti不成功!");
}
这段代码比较冗长,可以把它们放到一个结构中或者使用composite模式,再利用Iterator模式来遍历就OK了。而且如果去掉一个元素,也不用修改代码,而这段代码是需要修改的。
2.4.5 单例模式
作为对象的创建模式[GOF95], 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

public class GenNotiTimer extends Timer {
public static synchronized GenNotiTimer getInstance()
{
if(timerInstance == null)
timerInstance = new GenNotiTimer();
return timerInstance;
}
……..
}
2.4.6 Observer模式
Observer模式允许某个对象在所观察的对象发生修改时通知一个或多个观察者(Observer)。Observer模式也是MVC架构模式中一个很重要的部分。MVC中事件由控制器来处理,控制器接收用户事件,并根据事件的类型来改变模型。视图事先会在模型中登记,当模型数据发生改变时,马上通知已向此模型登记的每个视图。视图从模取得最新的数据并刷新自己。观察者(Observer)模式是又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-收听者(Source/Listener)模式或从属者(Dependents)模式,就象JMS的发布-订阅一样。下图是Observer模式的类图。

在这里说这个模式,是因为我们没有采用这个模式,总结一下,如果采用这个模式,程序的性能应该有一个提高。我们用了一个线程在不停地扫描数据库中的内容,进行相应的处理,即所谓的拉模式,而不是推模式。拉模式有些缺点,实时的粒度不好控制,时间间隔大了,起不到所谓的实时效果。间隔太小,就会抢占CPU和么memory资源,对系统的性能影响较大。相应的推模式就没有这样的问题。
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Nov 16 2007
Added on Mar 30 2004
21 comments
3,197 views