??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲美免无码中文字幕在线,亚洲国产精品久久久久秋霞小,jizzjizz亚洲日本少妇http://m.tkk7.com/WshmAndLily/category/10982.htmlzh-cnThu, 24 Apr 2008 15:48:28 GMTThu, 24 Apr 2008 15:48:28 GMT60UML cd关系http://m.tkk7.com/WshmAndLily/articles/194831.htmlsemovysemovyTue, 22 Apr 2008 09:35:00 GMThttp://m.tkk7.com/WshmAndLily/articles/194831.htmlhttp://m.tkk7.com/WshmAndLily/comments/194831.htmlhttp://m.tkk7.com/WshmAndLily/articles/194831.html#Feedback0http://m.tkk7.com/WshmAndLily/comments/commentRss/194831.htmlhttp://m.tkk7.com/WshmAndLily/services/trackbacks/194831.html
UMLcd关系全面剖析
 
2008-04-10 作?一雨田的专?来源:CSDN
 

UML的类囑օpd为:(x) 兌、聚?l合、依赖、泛化(l承Q。而其中关联又分ؓ(f)双向兌、单向关联、自w关联;下面p我们一h看看q些关系I竟是什么,以及(qing)它们的区别在哪里?/p>

1、关?/strong>

1000){this.resized=true;this.style.width=1000;}">

双向兌Q?/font>

C1-C2Q指双方都知道对方的存在Q都可以调用Ҏ(gu)的公共属性和Ҏ(gu)?/font>

在GOF的设计模式书上是q样描述的:(x)虽然在分析阶D这U关pL适用的,但我们觉得它对于描述设计模式内的cdpL说显得太抽象了,因ؓ(f)在设计阶D关联关pd被映射为对象引用或指针。对象引用本w就是有向的Q更适合表达我们所讨论的那U关pR所以这U关pd设计的时候比较少用到Q关联一般都是有向的?/font>

使用ROSE 生成的代码是q样的:(x)

1000){this.resized=true;this.style.width=1000;}" align=top>class C1 
1000){this.resized=true;this.style.width=1000;}" align=top>1000){this.resized=true;this.style.width=1000;}" align=top>...{
1000){this.resized=true;this.style.width=1000;}" align=top>public:
1000){this.resized=true;this.style.width=1000;}" align=top>    C2* theC2;
1000){this.resized=true;this.style.width=1000;}" align=top>
1000){this.resized=true;this.style.width=1000;}" align=top>};
1000){this.resized=true;this.style.width=1000;}" align=top>
1000){this.resized=true;this.style.width=1000;}" align=top>class C2 
1000){this.resized=true;this.style.width=1000;}" align=top>1000){this.resized=true;this.style.width=1000;}" align=top>...{
1000){this.resized=true;this.style.width=1000;}" align=top>public:
1000){this.resized=true;this.style.width=1000;}" align=top>    C1* theC1;
1000){this.resized=true;this.style.width=1000;}" align=top>
1000){this.resized=true;this.style.width=1000;}" align=top>};

双向兌在代码的表现为双斚w拥有Ҏ(gu)的一个指针,当然也可以是引用或者是倹{?/font>

1000){this.resized=true;this.style.width=1000;}">

单向兌:

C3->C4Q表C相识关p,指C3知道C4QC3可以调用C4的公共属性和Ҏ(gu)。没有生命期的依赖。一般是表示ZU引用?/font>

生成代码如下Q?/font>

1000){this.resized=true;this.style.width=1000;}" align=top>class C3 
1000){this.resized=true;this.style.width=1000;}" align=top>1000){this.resized=true;this.style.width=1000;}" align=top>...{
1000){this.resized=true;this.style.width=1000;}" align=top>public:
1000){this.resized=true;this.style.width=1000;}" align=top>    C4* theC4;
1000){this.resized=true;this.style.width=1000;}" align=top>
1000){this.resized=true;this.style.width=1000;}" align=top>};
1000){this.resized=true;this.style.width=1000;}" align=top>
1000){this.resized=true;this.style.width=1000;}" align=top>class C4 
1000){this.resized=true;this.style.width=1000;}" align=top>1000){this.resized=true;this.style.width=1000;}" align=top>...{
1000){this.resized=true;this.style.width=1000;}" align=top>
1000){this.resized=true;this.style.width=1000;}" align=top>};

单向兌的代码就表现为C3有C4的指针,而C4对C3一无所知?/font>

1000){this.resized=true;this.style.width=1000;}">

自n兌Q反w关联)Q?/font>

自己引用自己Q带着一个自q引用?/font>

代码如下Q?/font>

1000){this.resized=true;this.style.width=1000;}" align=top>class C14 
1000){this.resized=true;this.style.width=1000;}" align=top>1000){this.resized=true;this.style.width=1000;}" align=top>...{
1000){this.resized=true;this.style.width=1000;}" align=top>public:
1000){this.resized=true;this.style.width=1000;}" align=top>    C14* theC14;
1000){this.resized=true;this.style.width=1000;}" align=top>
1000){this.resized=true;this.style.width=1000;}" align=top>};

是在自q内部有着一个自w的引用?/font>

2、聚?l合

当类之间有整?部分关系的时候,我们可以用组合或者聚合?/p>

1000){this.resized=true;this.style.width=1000;}">

聚合Q表CC9聚合C10Q但是C10可以dC9而独立存在(独立存在的意思是在某个应用的问题域中q个cȝ存在有意义。这句话怎么解,L(fng)下面l合里的解释Q?/font>

代码如下Q?/font>

1000){this.resized=true;this.style.width=1000;}" align=top>class C9 
1000){this.resized=true;this.style.width=1000;}" align=top>1000){this.resized=true;this.style.width=1000;}" align=top>...{
1000){this.resized=true;this.style.width=1000;}" align=top>public:
1000){this.resized=true;this.style.width=1000;}" align=top>    C10 theC10;
1000){this.resized=true;this.style.width=1000;}" align=top>
1000){this.resized=true;this.style.width=1000;}" align=top>};
1000){this.resized=true;this.style.width=1000;}" align=top>
1000){this.resized=true;this.style.width=1000;}" align=top>class C10 
1000){this.resized=true;this.style.width=1000;}" align=top>1000){this.resized=true;this.style.width=1000;}" align=top>...{
1000){this.resized=true;this.style.width=1000;}" align=top>
1000){this.resized=true;this.style.width=1000;}" align=top>};
1000){this.resized=true;this.style.width=1000;}" align=top>

1000){this.resized=true;this.style.width=1000;}">

l合Q也有hUCؓ(f)包容Q:(x)一般是实心菱Ş加实U箭头表C,如上图所C,表示的是C8被C7包容Q而且C8不能dC7而独立存在。但q是视问题域而定的,例如在关心汽车的领域里,轮胎是一定要l合在汽车类中的Q因为它d了汽车就没有意义了。但是在卖轮胎的店铺业务里,q轮胎d了汽车,它也是有意义的,q就可以用聚合了。在《敏捷开发》中q说刎ͼAl合BQ则A需要知道B的生存周期,卛_能A负责生成或者释放BQ或者A通过某种途径知道B的生成和释放?/font>

他们的代码如下:(x)

1000){this.resized=true;this.style.width=1000;}" align=top>class C7 
1000){this.resized=true;this.style.width=1000;}" align=top>1000){this.resized=true;this.style.width=1000;}" align=top>...{
1000){this.resized=true;this.style.width=1000;}" align=top>public:
1000){this.resized=true;this.style.width=1000;}" align=top>    C8 theC8;
1000){this.resized=true;this.style.width=1000;}" align=top>
1000){this.resized=true;this.style.width=1000;}" align=top>};
1000){this.resized=true;this.style.width=1000;}" align=top>
1000){this.resized=true;this.style.width=1000;}" align=top>class C8 
1000){this.resized=true;this.style.width=1000;}" align=top>1000){this.resized=true;this.style.width=1000;}" align=top>...{
1000){this.resized=true;this.style.width=1000;}" align=top>};

可以看到Q代码和聚合是一L(fng)。具体如何区别,可能只能用语义来区分了?/p>

3、依?/strong>

1000){this.resized=true;this.style.width=1000;}">

依赖:

指C5可能要用到C6的一些方法,也可以这栯Q要完成C5里的所有功能,一定要有C6的方法协助才行。C5依赖于C6的定义,一般是在C5cȝ头文件中包含了C6的头文g。ROSE对依赖关pM产生属性?/font>

注意Q要避免双向依赖。一般来_(d)不应该存在双向依赖?/font>

ROSE生成的代码如下:(x)

1000){this.resized=true;this.style.width=1000;}" align=top>// C5.h
1000){this.resized=true;this.style.width=1000;}" align=top>Qi nclude "C6.h"
1000){this.resized=true;this.style.width=1000;}" align=top>
1000){this.resized=true;this.style.width=1000;}" align=top>class C5 
1000){this.resized=true;this.style.width=1000;}" align=top>1000){this.resized=true;this.style.width=1000;}" align=top>...{
1000){this.resized=true;this.style.width=1000;}" align=top>
1000){this.resized=true;this.style.width=1000;}" align=top>};
1000){this.resized=true;this.style.width=1000;}" align=top>
1000){this.resized=true;this.style.width=1000;}" align=top>// C6.h
1000){this.resized=true;this.style.width=1000;}" align=top>Qi nclude "C5.h"
1000){this.resized=true;this.style.width=1000;}" align=top>
1000){this.resized=true;this.style.width=1000;}" align=top>class C6
1000){this.resized=true;this.style.width=1000;}" align=top>1000){this.resized=true;this.style.width=1000;}" align=top>...{
1000){this.resized=true;this.style.width=1000;}" align=top>
1000){this.resized=true;this.style.width=1000;}" align=top>};
1000){this.resized=true;this.style.width=1000;}" align=top>

虽然ROSE不生成属性,但在形式上一般是A中的某个Ҏ(gu)把B的对象作为参C?假设A依赖于B)。如下:(x)

1000){this.resized=true;this.style.width=1000;}" align=top>Qi nclude "B.h"
1000){this.resized=true;this.style.width=1000;}" align=top>class A
1000){this.resized=true;this.style.width=1000;}" align=top>1000){this.resized=true;this.style.width=1000;}" align=top>...{
1000){this.resized=true;this.style.width=1000;}" align=top>          void Func(B &b);
1000){this.resized=true;this.style.width=1000;}" align=top>}

那依赖和聚合\l合、关联等有什么不同呢Q?/font>

兌是类之间的一U关p,例如老师教学生,老公和老婆Q水壶装水等是一U关pR这U关pL非常明显的,在问题领域中通过分析直接p得出?/font>

依赖是一U弱兌Q只要一个类用到另一个类Q但是和另一个类的关pM是太明显的时候(可以说是“uses”了那个类Q,可以把q种关系看成是依赖,依赖也可说是一U偶然的关系Q而不是必然的关系Q就?#8220;我在某个Ҏ(gu)中偶然用C它,但在现实中我和它q没多大关系”。例如我和锤子,我和锤子本来是没关系的,但在有一ơ要钉钉子的时候,我用C它,q就是一U依赖,依赖锤子完成钉钉子这件事情?/font>

l合是一U整?部分的关p,在问题域中这U关pd明显Q直接分析就可以得出的。例如轮胎是车的一部分Q树(wi)叶是?wi)的一部分Q手脚是w体的一部分q种的关p,非常明显的整?部分关系?/font>

上述的几U关p(兌、聚?l合、依赖)在代码中可能以指针、引用、值等的方式在另一个类中出玎ͼ不拘于Ş式,但在逻辑上他们就有以上的区别?/font>

q里q要说明一下,所谓的q些关系只是在某个问题域才有效,d了这个问题域Q可能这些关pd不成立了Q例如可能在某个问题域中Q我是一个木匠,需要拿着锤子dz,可能整个问题的描q就是我拿着锤子怎么钉桌子,钉椅子,钉柜子;既然整个问题是描述q个Q我和锤子就不仅是偶然的依赖关系了,我和锤子的关pd得非常的紧密Q可能就上升为组合关p(让我H然惌v武侠说的剑不离w,剑亡Z...Q。这个例子可能有点荒谬,但也是ؓ(f)了说明一个道理,是关系和类一P它们都是在一个问题领域中才成立的Q离开了这个问题域Q他们可能就不复存在了?/font>

4、泛化(l承Q?/strong>

1000){this.resized=true;this.style.width=1000;}">

泛化关系Q如果两个类存在泛化的关pL׃用,例如父和子,动物和老虎Q植物和q?/font>

ROSE生成的代码很单,如下Q?/font>

1000){this.resized=true;this.style.width=1000;}" align=top>Qi nclude "C11.h"
1000){this.resized=true;this.style.width=1000;}" align=top>
1000){this.resized=true;this.style.width=1000;}" align=top>class C12 : public C11
1000){this.resized=true;this.style.width=1000;}" align=top>1000){this.resized=true;this.style.width=1000;}" align=top>...{
1000){this.resized=true;this.style.width=1000;}" align=top>};

5、这里顺便提一下模?/font>

1000){this.resized=true;this.style.width=1000;}">

上面的图对应的代码如下:(x)

1000){this.resized=true;this.style.width=1000;}" align=top>template<int>
1000){this.resized=true;this.style.width=1000;}" align=top>class C13 
1000){this.resized=true;this.style.width=1000;}" align=top>1000){this.resized=true;this.style.width=1000;}" align=top>...{
1000){this.resized=true;this.style.width=1000;}" align=top>};
1000){this.resized=true;this.style.width=1000;}" align=top>

q里再说一下重复度Q其实看完了上面的描qC后,我们应该清楚了各个关p间的关pM?qing)具体对应到代码是怎么L(fng)Q所谓的重复度,也只不过是上面的扩展Q例如A和B有着“1对多”的重复度Q那在A中就有一个列表,保存着B对象的N个引用,是q样而已?/font>



semovy 2008-04-22 17:35 发表评论
]]>
利用java的动态代理写日志http://m.tkk7.com/WshmAndLily/articles/179319.htmlsemovysemovyMon, 04 Feb 2008 19:12:00 GMThttp://m.tkk7.com/WshmAndLily/articles/179319.htmlhttp://m.tkk7.com/WshmAndLily/comments/179319.htmlhttp://m.tkk7.com/WshmAndLily/articles/179319.html#Feedback0http://m.tkk7.com/WshmAndLily/comments/commentRss/179319.htmlhttp://m.tkk7.com/WshmAndLily/services/trackbacks/179319.html
Person.java

package com.semovy.bean;

public class Person {
 
 private String id;

 private String name;

 private String note;

 public String getId() {
  return id;
 }

 public void setId(String id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getNote() {
  return note;
 }

 public void setNote(String note) {
  this.note = note;
 }

 public Person(String id, String name, String note) {
  super();
  this.id = id;
  this.name = name;
  this.note = note;
 }

 @Override
 public String toString() {
  // TODO Auto-generated method stub
  return "id: " + id + " name: " +  name + " note: " + note;
 }

}
2.操作Person实体cȝ接口PersonService

PersonService.java

package com.semovy.service;

import java.util.ArrayList;
import java.util.List;

import com.semovy.bean.Person;

public interface PersonService {

 public List<Person> persons = new ArrayList<Person>();

 public abstract void addPerson(Person person);

 public abstract Person getPersonById(String id);

 public abstract void deletePersonById(String id);

 //public abstract void updatePerson(Person person);

 public abstract void displayPersonById(String id);

 public abstract void displayAllPersons();
}
3.实现PersonService接口的PersonServiceImpl

PersonServiceImpl.java

package com.semovy.service.impl;

import java.util.Iterator;

import com.semovy.bean.Person;
import com.semovy.service.PersonService;

public class PersonServiceImpl implements PersonService {

 public void addPerson(Person person) {
  persons.add(person);
 }

 public void deletePersonById(String id) {
  Iterator it = persons.iterator();
  while(it.hasNext())
  {
   Person person = (Person)it.next();
   if(person.getId().equals(id))
   {
    it.remove();
    break;
   }
  }
 }

 public void displayAllPersons() {
  
  Iterator it = persons.iterator();
  while(it.hasNext())
  {
   Person person = (Person)it.next();
   System.out.println(person.toString());
  }
 }

 public void displayPersonById(String id) {
  
  Iterator it = persons.iterator();
  while(it.hasNext())
  {
   Person person = (Person)it.next();
   if(person.getId().equals(id))
   {
    System.out.println(person.toString());
    break;
   }
  }
  
 }

 public Person getPersonById(String id) {
  Iterator it = persons.iterator();
  while(it.hasNext())
  {
   Person person = (Person)it.next();
   if(person.getId().equals(id))
   {
    return person;
   }
  }
  return null;
 }

 /*public void updatePerson(Strin) {
  Iterator it = persons.iterator();
  while(it.hasNext())
  {
   Person person = (Person)it.next();
   if(person == aperson)
   {
    persons.set(arg0, arg1)
   }
  }
 }*/

}

4.写日志的代理cLogProxy   它实CInvocationHandler接口

LogProxy.java

package com.semovy.bean;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;


public class LogProxy implements InvocationHandler {
 
 Logger logger = Logger.getLogger(this.getClass().getName());
 private Object delegate = null;
 
 public Object getDelegate() {
  return delegate;
 }

 public void setDelegate(Object delegate) {
  this.delegate = delegate;
 }

 public Object bind(Object delegate) {
  this.delegate = delegate;
  return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
    delegate.getClass().getInterfaces(),this);
 }

 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  Object result = null;
  try
  {
   logger.log(Level.INFO,method.getName() +  " 开始处?..");
   result = method.invoke(this.delegate, args);
   logger.log(Level.INFO,method.getName() +  " l束处理...");
  }catch(Exception e)
  {
   logger.log(Level.ERROR,e.getLocalizedMessage());
  }
  
  return result;
 }
}

5.在eclipse中添加log4j.properties

log4j.properties

log4j.rootLogger=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%F:%L) - %m%n

5.写测试类Test.java

Test.java

package com.semovy.test;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import com.semovy.bean.LogProxy;
import com.semovy.bean.Person;
import com.semovy.service.PersonService;
import com.semovy.service.impl.PersonServiceImpl;

public class Test {

 /**
  * @param args
  */
 public static void main(String[] args) {

  LogProxy logProxy = new LogProxy();
  PersonService personService = (PersonService)logProxy.bind(new PersonServiceImpl());
  personService.addPerson(new Person("1","name1","note1"));
  personService.addPerson(new Person("2","name2","note2"));
  personService.addPerson(new Person("3","name3","note3"));
  personService.addPerson(new Person("4","name4","note4"));
  personService.displayPersonById("3");
  personService.displayAllPersons();
  Person person = personService.getPersonById("2");
  person.setName("名称2");
  person.setNote("注脚2");
  personService.displayAllPersons();
  personService.deletePersonById("2");
  personService.displayAllPersons();
  //saveToFile(persons,"c:/persons.txt");
 }
 
 public static void saveToFile(List list,String path)
 {
  System.out.println("开始写入文?..");
  try
  {
   PrintWriter out = new PrintWriter(new File(path));
   Iterator it = list.iterator();
   while(it.hasNext())
   {
    Person person = (Person)it.next();
    out.println(person.toString());
   }
   out.flush();
   out.close();
   System.out.println("l束写入文g...");
  }catch(IOException e)
  {
   System.out.println(e.getLocalizedMessage());
  }
  
 }
}


6.q行试l果:

2008-02-05 02:55:28,926  INFO (LogProxy.java:34) - addPerson 开始处?..
2008-02-05 02:55:28,926  INFO (LogProxy.java:36) - addPerson l束处理...
2008-02-05 02:55:28,926  INFO (LogProxy.java:34) - addPerson 开始处?..
2008-02-05 02:55:28,926  INFO (LogProxy.java:36) - addPerson l束处理...
2008-02-05 02:55:28,926  INFO (LogProxy.java:34) - addPerson 开始处?..
2008-02-05 02:55:28,936  INFO (LogProxy.java:36) - addPerson l束处理...
2008-02-05 02:55:28,936  INFO (LogProxy.java:34) - addPerson 开始处?..
2008-02-05 02:55:29,036  INFO (LogProxy.java:36) - addPerson l束处理...
2008-02-05 02:55:29,036  INFO (LogProxy.java:34) - displayPersonById 开始处?..
id: 3 name: name3 note: note3
2008-02-05 02:55:29,036  INFO (LogProxy.java:36) - displayPersonById l束处理...
2008-02-05 02:55:29,036  INFO (LogProxy.java:34) - displayAllPersons 开始处?..
id: 1 name: name1 note: note1
id: 2 name: name2 note: note2
id: 3 name: name3 note: note3
id: 4 name: name4 note: note4
2008-02-05 02:55:29,046  INFO (LogProxy.java:36) - displayAllPersons l束处理...
2008-02-05 02:55:29,046  INFO (LogProxy.java:34) - getPersonById 开始处?..
2008-02-05 02:55:29,046  INFO (LogProxy.java:36) - getPersonById l束处理...
2008-02-05 02:55:29,046  INFO (LogProxy.java:34) - displayAllPersons 开始处?..
id: 1 name: name1 note: note1
id: 2 name: 名称2 note: 注脚2
id: 3 name: name3 note: note3
id: 4 name: name4 note: note4
2008-02-05 02:55:29,046  INFO (LogProxy.java:36) - displayAllPersons l束处理...
2008-02-05 02:55:29,046  INFO (LogProxy.java:34) - deletePersonById 开始处?..
2008-02-05 02:55:29,046  INFO (LogProxy.java:36) - deletePersonById l束处理...
2008-02-05 02:55:29,046  INFO (LogProxy.java:34) - displayAllPersons 开始处?..
id: 1 name: name1 note: note1
id: 3 name: name3 note: note3
id: 4 name: name4 note: note4
2008-02-05 02:55:29,046  INFO (LogProxy.java:36) - displayAllPersons l束处理...




semovy 2008-02-05 03:12 发表评论
]]>
关于目框架设计的一点学?http://m.tkk7.com/WshmAndLily/articles/145588.htmlsemovysemovySun, 16 Sep 2007 13:10:00 GMThttp://m.tkk7.com/WshmAndLily/articles/145588.htmlhttp://m.tkk7.com/WshmAndLily/comments/145588.htmlhttp://m.tkk7.com/WshmAndLily/articles/145588.html#Feedback0http://m.tkk7.com/WshmAndLily/comments/commentRss/145588.htmlhttp://m.tkk7.com/WshmAndLily/services/trackbacks/145588.html关于目框架设计的一点学?/span>

q两天又在接触一个新目Q对于如何设计一个项目的框架有了Ҏ(gu)念,关于web目Q对于oapȝ来说Q的M感觉比较需要设计的几部分ؓ(f)Q?/span>

1Q?nbsp;面模板定义Q关于view层展C,无论对于topQ顶层菜单)+leftQ左Ҏ(gu)(wi)状菜单)+rightQ主体内容)l构q是left+rightl构Q都需要首先定制一些模板,如struts中可使用tiles定义?/span>

2Q?nbsp;分页标签Q自定义一个比较通用的分|{或者用一些框架中自带的(如struts-menu或者JSF中的t:dataScrollerQ,不过比较好的做法是基于其源码~写自己的分|{?/span>

3Q?nbsp;DB 设计Q可使用Power Deisign{设计数据库表结构,产生相关的表?/span>

4Q?nbsp;代码自动生成Q编写代码生成脚本如build.xml文g的编写(Ҏ(gu)DB生成代码Q也可以忽略3Q先建modelQ再从model生成代码和数据库schemaQ,生成Struts、Spring、Hibernate相关文g?/span>

关于代码的整体架构如下:(x)

action 层:(x)处理从view层传递过来的数据?/span>

service 层:(x)装业务逻辑Q一般同时在spring中声明事务代理?/span>

dao 层:(x)q行事务中的原子操作Q同时在spring中注入相应的sessionFactory?/span>

Spring + Struts 取得spring的bean的两U常用方法:(x)

1.     DelegatingActionProxy Q将所有action标签中type属性设为org.springframework.web.struts.DelegatingActionProxy 也就是将action委托l了springQ同时在 action-servlets.xml 中配|一个于action标签path属性对应的bean(也就是bean的name值等于action的path?Q如Q?/span>

struts-config.xml 中,以struts的plugin的方?让spring接管struts的actionQ?/span>

< action name = "portalForm" parameter = "method" path = "/portalAction" type = "org.springframework.web.struts.DelegatingActionProxy" scope = "request" >

    < forward name = "portalEdit" path = " pages/portalEdit.jsp" />

    < forward name = "portalList" path = " pages/portalList.jsp " />

</ action >

< plug-in className = "org.springframework.web.struts.ContextLoaderPlugIn" >

    < set-property property = "contextConfigLocation"

          value = "/WEB-INF/action-servlets.xml" />

</ plug-in >

action-servlets.xml Q配|文件格式和spring配置一P中:(x)

< beans >

    < bean name = "/portalAction"

          class = "com.cn.lively.action.PortalMainAction" >

        < property name = "portalService" >

            < ref bean = "portalService" />

        </ property >

    </ bean >

</ beans >

2.     WebApplicationContextUtils.getRequiredWebApplicationContext Q在action中获得spring的beanQ?/span>

public Object getService (String name) {  

    ApplicationContext wac =     WebApplicationContextUtils.getRequiredWebApplicationContext(servlet.getServletContext());  

    return wac .getBean(name);  

}  

q种方式没有在struts里边加入spring的pluginQ实际上是用了依赖查找来获得对象,q且在servlet代码中硬~码了应用对象的bean名字?/span>

附:(x)

感觉一个国内小型项目(周期半年左右Q的开发,完美的团队大概四个h左右够了,

A Q前期框架设?+ 开发过E中不断改进完美整个框架Q角艜y—架构师

B Q前期需求调?+ 开发过E中负责技术难度比较大的模块开发,角色——程序员

C Q前期需求调研负责h + 开发过E中负责业务逻辑复杂的模块开发,角色——项目负责h

D Q前期需求调?+ 开发过E中负责模块开发,角色——程序员

同时B、C负责共同解决开发中出现的技术和业务问题QC负责控制目q度Q?/span>

目后期QB、C、Dq行交叉试QA负责review代码?/span>

如果公司已经比较成熟的框Ӟ卛_本系l管理模?+ 代码自动生成Q,那么角色A可以省略Q只需要B、C、D三个人即可进行项目开发,其中角色B在开发中担当一部分A的角艌Ӏ?/span>

甚至可以只由B、C两个行开发,把角色D的工作分担到B、Cw上QB侧重技术,C侧重业务逻辑?/span>



semovy 2007-09-16 21:10 发表评论
]]>
UMLcȝ?qing)关p?/title><link>http://m.tkk7.com/WshmAndLily/articles/135835.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 10 Aug 2007 06:38:00 GMT</pubDate><guid>http://m.tkk7.com/WshmAndLily/articles/135835.html</guid><wfw:comment>http://m.tkk7.com/WshmAndLily/comments/135835.html</wfw:comment><comments>http://m.tkk7.com/WshmAndLily/articles/135835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/WshmAndLily/comments/commentRss/135835.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/WshmAndLily/services/trackbacks/135835.html</trackback:ping><description><![CDATA[<div style="MARGIN-TOP: 1px; MARGIN-LEFT: 15px"> <h2><a title=怹链接QUMLcȝ?qing)关p?><font color=#444444>UMLcȝ?qing)关p?/font></a> </h2> </div> <div style="MARGIN-TOP: 10px; MARGIN-LEFT: 15px"> <table width="100%"> <tbody> <tr> <td> <p><font face=Arial>cMcM间的关系对于理解面向对象h很重要的作用Q以前在面试的时候也l常被问到这个问题,在这里我׃l一下?br>cMcM间存在以下关p?<br><strong><font color=#3366ff>(1)泛化(Generalization)<br>(2)兌(Association)<br>(3)依赖(Dependency)<br>(4)聚合(Aggregation)</font></strong></font> </p> <p><font face=Arial><strong>UML图与应用代码例子:</strong> <br><strong><font color=#ff9900 size=4><font color=#3366ff>1.泛化(Generalization)</font> <br></font><font color=#339966 size=3>[泛化]</font> <br></strong>表示cMcM间的l承关系Q接口与接口之间的承关p,或类Ҏ(gu)口的实现关系。一般化的关pL从子cL向父cȝQ与l承或实现的Ҏ(gu)相反?br><font color=#339966 size=3><strong>[具体表现]<br></strong></font><font color=#ff0000>父类</font> 父类实例Qnew <font color=#ff0000>子类</font>()<br><strong><font color=#339966 size=3>[UML图](?.1)<br></font><img alt="" src="http://seagar.javaeye.com/upload/picture/pic/1320/10bfdb9d-ed2d-4226-bab2-f814d2e10a82.jpg"><br></strong><font face=Arial><font color=#339966><strong>?.1</strong></font><strong>AnimalcMTigerc?Dogcȝ泛化关系<br></strong></font><br><strong><font color=#339966 size=3>[代码表现]</font><br><br></strong></font></p> <div id="dtfhttb" class=dp-highlighter> <div id="d9rj9p5" class=bar><strong></strong></div> <ol class=dp-j> <li id="vjl9d3j" class=alt><span><span id="933pztl" class=keyword><font color=#993333>class</font></span> <span><strong> Animal{}   </strong> </span></span><strong></strong> <li id="fx1dtv3" class=""><span></span><span id="7xx7vfp" class=keyword><font color=#993333>class</font></span> <strong><span> Tiger </span> <span id="jv1jr9l" class=keyword><font color=#993333>extends</font></span> <span> Animal{}   </span> </strong> <li id="z7fpxrp" class=alt><span></span><span id="b99vbln" class=keyword><font color=#993333>public</font></span> <strong><span> </span> <span id="vbrnn7z" class=keyword><font color=#993333>class</font></span> <span> Test   </span> </strong> <li id="v7ddffn" class=""><strong><span>{   </span> </strong> <li id="jnpj91r" class=alt><strong><span>    </span> <span id="9x9bl99" class=keyword><font color=#993333>public</font></span> <span> </span> <span id="9rrjllx" class=keyword><font color=#993333>void</font></span> <span> test()   </span> </strong> <li id="x3hztjd" class=""><strong><span>    {   </span> </strong> <li id="nzln7vx" class=alt><strong><span>        Animal a=</span> <span id="f7x1vvh" class=keyword><font color=#993333>new</font></span> <span> Tiger();   </span> </strong> <li id="p99jl9l" class=""><strong><span>    }   </span> </strong> <li id="5fx9x9n" class=alt><strong><span>}  </span> </strong></li> </ol> </div> <br><font face=Arial><strong><font color=#3366ff size=4>2.依赖(Dependency)</font> <br></strong><font color=#339966 size=3><strong>[依赖]<br></strong></font>对于两个相对独立的对象,当一个对象负责构造另一个对象的实例Q或者依赖另一个对象的服务Ӟq两个对象之间主要体Cؓ(f)依赖关系?br><font color=#339966 size=3><strong>[具体表现]<br></strong></font>依赖关系表现?font color=#ff0000>局部变?/font>Q?font color=#ff0000>Ҏ(gu)的参?/font>Q以?qing)?font color=#ff0000>静态方法的调用</font><br><font color=#339966 size=3><strong>[现实例子]<br></strong></font>比如说你要去拧螺丝,你是不是要借助(也就是依?Z刀(Screwdriver)来帮助你完成拧螺?screw)的工?br><font color=#339966 size=3><strong>[UML表现](?.2)</strong></font><br> <p align=left><strong><img alt="" src="http://seagar.javaeye.com/upload/picture/pic/1319/ec7bca6c-c01a-4772-a91b-3a695773ddfb.jpg"></strong></p> <p align=left><br><font face=Arial><strong><font color=#339966>?.2 </font>PersoncMScrewdrivercȝ依赖关系</strong><br><font face=Arial><font color=#339966 size=3><strong><br>[代码表现] </strong></font></font></font></p> <div id="hllvnx1" class=dp-highlighter> <div id="t9tvpzz" class=bar><strong></strong></div> <ol class=dp-j> <li id="n999t39" class=alt><span><span id="7t9xxrp" class=keyword><font color=#993333>public</font></span><strong><span> </span><span id="p3t9z5j" class=keyword><font color=#993333>class</font></span><span> Person{   </span></strong></span><strong></strong> <li id="f3rn11f" class=""><strong><span>    </span><span id="vhrb93x" class=comment><font color=#666666>/** 拧螺?nbsp;*/</font></span><span>  </span></strong> <li id="zfx9d39" class=alt><strong><span>    </span><span id="j3nzjbb" class=keyword><font color=#993333>public</font></span><span> </span><span id="pv3tdd9" class=keyword><font color=#993333>void</font></span><span> screw(Screwdriver screwdriver){   </span></strong> <li id="bxrtl9n" class=""><strong><span>        screwdriver.screw();   </span></strong> <li id="vtbtnvf" class=alt><strong><span>    }   </span></strong> <li id="p959v3b" class=""><strong><span>}  </span></strong></li> </ol> </div> <br><font face=Arial><strong><font color=#3366ff size=4>3.兌(Association)</font><br></strong><font color=#339966 size=3><strong>[兌]<br></strong></font>对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系Ӟq两个对象之间ؓ(f)兌关系?br><font color=#339966 size=3><strong>[具体表现]<br></strong></font>兌关系是?font color=#ff0000>实例变量</font>来实?br><font color=#339966 size=3><strong>[现实例子]<br></strong></font>比如客户和订单,每个订单对应特定的客P每个客户对应一些特定的订单Q再例如公司和员工,每个公司对应一些特定的员工Q每个员工对应一特定的公?br><strong><font color=#339966 size=3>[UML图] (?.3)<br></font><img alt="" src="http://seagar.javaeye.com/upload/picture/pic/1318/d4b10677-364d-4c34-beb7-416f8e835d8c.jpg"><br><font face=Arial><strong><font color=#339966>?.3 </font></strong>公司和员工的兌关系</font></strong></font><br><font face=Arial><strong><br><font color=#339966 size=3>[代码表现]</font></strong> <div id="p3jl3dt" class=dp-highlighter> <div id="p73hrjr" class=bar><strong></strong></div> <ol class=dp-j> <li id="7vp1dph" class=alt><span><span id="lpbbtvl" class=keyword><font color=#993333>public</font></span><strong><span> </span><span id="hd9h9np" class=keyword><font color=#993333>class</font></span><span> Company{   </span></strong></span><strong></strong> <li id="7l3rjtb" class=""><strong><span>    </span><span id="vbl9lnx" class=keyword><font color=#993333>private</font></span><span> Employee employee;   </span></strong> <li id="trblndn" class=alt><strong><span>    </span><span id="rfxrzzl" class=keyword><font color=#993333>public</font></span><span> Employee getEmployee(){   </span></strong> <li id="tzjrbtt" class=""><strong><span>        </span><span id="h3vn9dv" class=keyword><font color=#993333>return</font></span><span> employee;   </span></strong> <li id="tpr7fhx" class=alt><strong><span>    }   </span></strong> <li id="fjbvfvd" class=""><strong><span>    </span><span id="fbl9h3v" class=keyword><font color=#993333>public</font></span><span> </span><span id="jnfxxpv" class=keyword><font color=#993333>void</font></span><span> setEmployee(Employee employee){   </span></strong> <li id="79hzbtp" class=alt><strong><span>        </span><span id="bpxph9b" class=keyword><font color=#993333>this</font></span><span>.employee=employee;   </span></strong> <li id="vh3blnv" class=""><strong><span>    }   </span></strong> <li id="7dlvphz" class=alt><strong><span>    </span><span id="vxhb9n1" class=comment><font color=#666666>//公司q作 </font></span><span>  </span></strong> <li id="7xx9x7l" class=""><strong><span>    </span><span id="93hzjjd" class=keyword><font color=#993333>public</font></span><span> </span><span id="v3j9j9h" class=keyword><font color=#993333>void</font></span><span> run(){   </span></strong> <li id="n9599zj" class=alt><strong><span>        employee.startWorking();   </span></strong> <li id="h9ffrdx" class=""><strong><span>    }   </span></strong> <li id="x3btbdj" class=alt><strong><span>}  </span></strong></li> </ol> </div> </font></font><font face=Arial><strong><font color=#3366ff size=4>(4)聚合QAggregationQ?/font> <br><font color=#339966 size=3>[聚合]<br></font></strong>当对象A被加入到对象B中,成ؓ(f)对象B的组成部分时Q对象B和对象A之间集关pR聚合是兌关系的一U,是较强的兌关系Q强调的?font color=#ff0000>整体</font>?font color=#ff0000>部分</font>之间的关pR?font color=#ff0000>cM于将本职的工作委托给其他c?/font><br><font color=#339966 size=3><strong>[具体表现]<br></strong></font>与关联关pMP聚合关系也是通过<font color=#ff0000>实例变量</font>来实现这样关pȝ。关联关pd聚合关系来语法上是没办法区分的,?font color=#ff0000>语义</font>上才?font color=#ff0000>更好的区?/font>两者的区别?br><font color=#339966 size=3><strong>[兌与聚合的区别]</strong></font><br>(1)兌关系所涉及(qing)的两个对象是处在同一个层ơ上的。比如h和自行R是一U关联关p,而不是聚合关p,因ؓ(f)Z是由自行车组成的?br>聚合关系涉及(qing)的两个对象处于不q等的层ơ上Q一个代表整体,一个代表部分。比如电(sh)脑和它的昄器、键盘、主板以?qing)内存就是聚集关p,因ؓ(f)L是电(sh)脑的l成部分?br>(2)对于h聚集关系Q尤其是集关p)的两个对象,整体对象?x)制U它的组成对象的生命周期。部分类的对象不能单独存在,它的生命周期依赖于整体类?对象的生命周期,当整体消失,部分也就随之消失。比如张三的?sh)脑被偷了,那么电(sh)脑的所有组件也不存在了Q除非张三事先把一些电(sh)脑的lgQ比如硬盘和内存Q?拆了下来?br><font color=#339966 size=3><strong>[UML图](?.4)</strong></font><br><strong><img alt="" src="http://seagar.javaeye.com/upload/picture/pic/1326/7032798b-36ca-4b89-a462-97ba056cbe48.jpg"><br><font face=Arial><strong><font color=#339966>?.3 </font><font color=#000000>?sh)脑和组件的聚合关?/font></strong></font><br><br><font face=Arial><font color=#339966 size=3><strong>[代码表现]</strong></font></font></strong> <div id="vld3vbb" class=dp-highlighter> <ol class=dp-j> <li id="rz1xrpf" class=alt><span><span id="j7f9bdl" class=keyword><font color=#993333>public</font></span><strong><span> </span><span id="xbl1vxn" class=keyword><font color=#993333>class</font></span><span> Computer{   </span></strong></span><strong></strong> <li id="f1lnppp" class=""><strong><span>    </span><span id="t9btrt3" class=keyword><font color=#993333>private</font></span><span> CPU cpu;   </span></strong> <li id="zxzhrhz" class=alt><strong><span>    </span><span id="9hbbt93" class=keyword><font color=#993333>public</font></span><span> CPU getCPU(){   </span></strong> <li id="hfpzbj9" class=""><strong><span>        </span><span id="1zh5rp1" class=keyword><font color=#993333>return</font></span><span> cpu;   </span></strong> <li id="r7pjj9l" class=alt><strong><span>    }   </span></strong> <li id="dzz7np7" class=""><strong><span>    </span><span id="t13phhh" class=keyword><font color=#993333>public</font></span><span> </span><span id="9vxrzjh" class=keyword><font color=#993333>void</font></span><span> setCPU(CPU cpu){   </span></strong> <li id="htvn93d" class=alt><strong><span>        </span><span id="znfpr3j" class=keyword><font color=#993333>this</font></span><span>.cpu=cpu;   </span></strong> <li id="d3hjdnx" class=""><strong><span>    }   </span></strong> <li id="f1j393d" class=alt><strong><span>    </span><span id="xbl7hj9" class=comment><font color=#666666>//开启电(sh)?</font></span><span>  </span></strong> <li id="jd1jzjr" class=""><strong><span>    </span><span id="pjddxxr" class=keyword><font color=#993333>public</font></span><span> </span><span id="htnh9nl" class=keyword><font color=#993333>void</font></span><span> start(){   </span></strong> <li id="1rllnv9" class=alt><strong><span>        </span><span id="ht1zzb9" class=comment><font color=#666666>//cpuq作 </font></span><span>  </span></strong> <li id="1b9lxfx" class=""><strong><span>        cpu.run();   </span></strong> <li id="5vxh79f" class=alt><strong><span>    }   </span></strong> <li id="7jjtlvv" class=""><strong><span>}  </span></strong></li> </ol> </div> <br><br><font face=Arial color=#99cc00><strong>[参考资料]<br>1.《Java与模式?阎宏 ~著) W??l一建模语言UML?br><br><br><br></strong><font color=#ff0000>最l的判别可以以内存结构ؓ(f)区分Q比如关联与依赖比较隑ֈ别,那么Q你可以判断Q某个对象是在当前类里被实例的还是,只传了引用!如果是引用,则关联,否则是依赖Q比?br>public class Test {<br>private B b;<br>private A a;<br>public void exec() {<br>    A a = new A();<br>    b.exec();<br>}<br><br>//a , b 的getter,setter省略<br>}<br>其中Acd象a是依赖Q因为a对象的内存空间被创徏在Test</font></font></font><font face=Verdana> </font><font face=Arial color=#99cc00><font color=#ff0000><font face=Arial>q个</font> </font></font><font face=Arial><font face=Arial color=#99cc00><font color=#ff0000>c里<br>而Bcȝb对象则是引用Q?br></font><strong></strong></font></font></td> </tr> </tbody> </table> </div> <img src ="http://m.tkk7.com/WshmAndLily/aggbug/135835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/WshmAndLily/" target="_blank">semovy</a> 2007-08-10 14:38 <a href="http://m.tkk7.com/WshmAndLily/articles/135835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>l一建模语言UML http://m.tkk7.com/WshmAndLily/articles/120983.htmlsemovysemovyWed, 30 May 2007 12:46:00 GMThttp://m.tkk7.com/WshmAndLily/articles/120983.htmlhttp://m.tkk7.com/WshmAndLily/comments/120983.htmlhttp://m.tkk7.com/WshmAndLily/articles/120983.html#Feedback0http://m.tkk7.com/WshmAndLily/comments/commentRss/120983.htmlhttp://m.tkk7.com/WshmAndLily/services/trackbacks/120983.html
软g工程领域?995q至1997q取得了前所未有的进?其成果超qY件工E领域过?5q来的成d。其中最重要的、具有划时代重大意义的成果之一是l一建模语言(UML:Unified Modeling Language)的出现?

在世界范围内,臛_在近10q内,UML是面向对象技术领域内占主导地位的标准建模语言。采用UML作ؓ(f)我国l一的徏模语a是完全必要的:首先,q去数十U面向对象的建模语言都是怺独立?而UML可以消除一些潜在的不必要的差异,以免用户h;其次,通过l一语义和符可C?能够E_我国的面向对象技术市?佉K目根植于一个成熟的标准建模语言,从而可以大大拓宽所研制与开发的软gpȝ的适用范围,q大大提高其灉|E度?

l一建模语言QUMLQ是用来对Y件密集系l进行描q、构造、视化和文档~制的一U语a?

首先Q也是最重要的一点,l一建模语言融合了Booch、OMT和OOSEҎ(gu)中的概念Q它是可以被上述?qing)其他方法的使用者广泛采用的一门简单、一致、通用的徏模语a?

其次Q统一建模语言扩展了现有方法的应用范围。特别值得一提的是,UML的开发者们把ƈ行分布式pȝ的徏模作为UML的设计目标,也就是说QUMLh处理q类问题的能力?

W三Q统一建模语言是标准的建模语言Q而不是一个标准的开发流E。虽然UML的应用必然以pȝ的开发流Eؓ(f)背景Q但Ҏ(gu)我们的经验,不同的组l,不同的应用领域需要不同的开发过E。D个例子来_(d)开发错l复杂的软g是非常有的工作Q但开发这UY件与构造严格实时的航空?sh)子pȝ是大不一L(fng)Q后者是性命攸关的大事。因此我们首先把_֊集中在设计通用的元模型上(l一不同Ҏ(gu)的语义)Q其ơ是建立通用的表C法Q提供对q些语义的Ş象化的表达)。虽然UML的开发者们l倡导从用例驱动到体系l构Z心最后反复改q、不断添加的软g开发过E,但实际上设计标准的开发流Eƈ不是非常必要的?

UML是一U定义良好、易于表达、功能强大且普遍适用的徏模语a。它溶入了Y件工E领域的新思想、新Ҏ(gu)和新技术。它的作用域不限于支持面向对象的分析与设?q支持从需求分析开始的软g开发的全过E?

面向对象技术和UML的发展过E可用上图来表示,标准建模语言的出现是光要成果。在国,截止1996q?0?UML获得了工业界、科技界和应用界的q泛支持,已有700多个公司表示支持采用UML作ؓ(f)建模语言?996q底,UML已稳占面向对象技术市场的85%,成ؓ(f)可视化徏模语a事实上的工业标准?997q?1?7?OMG采纳UML 1.1作ؓ(f)Z面向对象技术的标准建模语言。UML代表了面向对象方法的软g开发技术的发展方向,h巨大的市场前?也具有重大的l济价值和国防价倹{?

标准建模语言UML的内?

首先,UML融合了Booch、OMT和OOSEҎ(gu)中的基本概念,而且q些基本概念与其他面向对象技术中的基本概念大多相?因?UML必然成ؓ(f)q些Ҏ(gu)以及(qing)其他Ҏ(gu)的用者乐于采用的一U简单一致的建模语言;其次,UML不仅仅是上述Ҏ(gu)的简单汇?而是在这些方法的基础上广泛征求意?集众家之?几经修改而完成的,UML扩展了现有方法的应用范围;W三,UML是标准的建模语言,而不是标准的开发过E。尽UML的应用必然以pȝ的开发过Eؓ(f)背景,但由于不同的l织和不同的应用领域,需要采取不同的开发过E?

作ؓ(f)一U徏模语a,UML的定义包括UML语义和UML表示法两个部分?

(1) UML语义 描述ZUML的精元模型定义。元模型为UML的所有元素在语法和语义上提供了简单、一致、通用的定义性说?使开发者能在语义上取得一?消除了因异的最佌达方法所造成的媄(jing)响。此外UMLq支持对元模型的扩展定义?

(2) UML表示?定义UMLW号的表C法,为开发者或开发工具用这些图形符号和文本语法为系l徏模提供了标准。这些图形符号和文字所表达的是应用U的模型,在语义上它是UML元模型的实例?

标准建模语言UML的重要内容可以由下列五类??U图?来定?

·W一cL用例?从用戯度描q系l功?q指出各功能的操作者?

·W二cL静态图(Static diagram),包括cd、对象图和包图。其中类图描q系l中cȝ静态结构。不仅定义系l中的类,表示cM间的联系如关联、依赖、聚合等,也包括类的内部结?cȝ属性和操作)。类图描q的是一U静态关p?在系l的整个生命周期都是有效的。对象图是类囄实例,几乎使用与类囑֮全相同的标识。他们的不同点在于对象图昄cȝ多个对象实例,而不是实际的cR一个对象图是类囄一个实例。由于对象存在生命周?因此对象囑֏能在pȝ某一旉D存在。包由包或类l成,表示包与包之间的关系。包囄于描q系l的分层l构?

·W三cL行ؓ(f)?Behavior diagram),描述pȝ的动态模型和l成对象间的交互关系。其中状态图描述cȝ对象所有可能的状态以?qing)事件发生时状态的转移条g。通常,状态图是对cd的补充。在实用上ƈ不需要ؓ(f)所有的cȝ状态图,仅ؓ(f)那些有多个状态其行ؓ(f)受外界环境的影响q且发生改变的类ȝ态图。而活动图描述满用例要求所要进行的zd以及(qing)zd间的U束关系,有利于识别ƈ行活动?

·W四cL交互?Interactive diagram),描述对象间的交互关系。其中顺序图昄对象之间的动态合作关p?它强调对象之间消息发送的序,同时昄对象之间的交?合作图描q对象间的协作关p?合作图跟序囄?昄对象间的动态合作关pR除昄信息交换?合作图还昄对象以及(qing)它们之间的关pR如果强调时间和序,则用顺序图;如果上下U关p?则选择合作图。这两种囑֐UCؓ(f)交互图?

·W五cL实现? Implementation diagram )。其中构件图描述代码部g的物理结构及(qing)各部件之间的依赖关系。一个部件可能是一个资源代码部件、一个二q制部g或一个可执行部g。它包含逻辑cL实现cȝ有关信息。部件图有助于分析和理解部g之间的相互媄(jing)响程度?

配置囑֮义系l中软硬件的物理体系l构。它可以昄实际的计机和设?用节点表C?以及(qing)它们之间的连接关p?也可昄q接的类型及(qing)部g之间的依赖性。在节点内部,攄可执行部件和对象以显C点跟可执行Y件单元的对应关系?

从应用的角度?当采用面向对象技术设计系l时,首先是描q需?其次Ҏ(gu)需求徏立系l的静态模?以构造系l的l构;W三步是描述pȝ的行为。其中在W一步与W二步中所建立的模型都是静态的,包括用例图、类?包含?、对象图、组件图和配|图{五个图?是标准徏模语aUML的静态徏模机制。其中第三步中所建立的模型或者可以执?或者表C执行时的时序状态或交互关系。它包括状态图、活动图、顺序图和合作图{四个图?是标准徏模语aUML的动态徏模机制。因?标准建模语言UML的主要内容也可以归纳为静态徏模机制和动态徏模机制两大类?/ca>

semovy 2007-05-30 20:46 发表评论
]]>
UML基础知识http://m.tkk7.com/WshmAndLily/articles/117899.htmlsemovysemovyWed, 16 May 2007 09:50:00 GMThttp://m.tkk7.com/WshmAndLily/articles/117899.htmlhttp://m.tkk7.com/WshmAndLily/comments/117899.htmlhttp://m.tkk7.com/WshmAndLily/articles/117899.html#Feedback0http://m.tkk7.com/WshmAndLily/comments/commentRss/117899.htmlhttp://m.tkk7.com/WshmAndLily/services/trackbacks/117899.htmlUML基础知识

1.       软g工程?/span>5个阶D:(x)需求分?/strong>(Requirements Capture)Q?strong style="mso-bidi-font-weight: normal">pȝ分析与设?/strong>(System Analysis and Design)Q?strong style="mso-bidi-font-weight: normal">实现(Implement)Q?strong style="mso-bidi-font-weight: normal">试(Test)Q?strong style="mso-bidi-font-weight: normal">l护(Maintenance)?/span>

2.       UML的定义包?/span>UML语义?/span>UML表示?/span>两个部分?/span>UML语义描述ZUML的精?strong style="mso-bidi-font-weight: normal">元模型定?/strong>。元模型?/span>UML的所有元素在语法和语义上提供了简单、一致和通用的定义性说明?/span>UML表示法,为开发者或开发工具用图形工具和文本语法为系l徏模提供了标准?/span>

3.      UML(Unified Modeling Language)?strong style="mso-bidi-font-weight: normal">视图(View)Q?strong style="mso-bidi-font-weight: normal">?/strong>(Diagram)Q?strong style="mso-bidi-font-weight: normal">模型元素(Model Element)Q?strong style="mso-bidi-font-weight: normal">通用机制(General Mechanism){组成,q提供了扩展机制(Extension Mechanism)Q?/span>UML语言能够适应一个特D的Ҏ(gu)或者扩充到一个组l或用户?/span>

a)         视图是表辄l的某一斚w特征?/span>UML建模元素的子集,由多?strong style="mso-bidi-font-weight: normal">?/strong>构成Q是在某一个抽象层上,对系l的抽象表示?/span>

b)        ?/span>是模型元素集?strong style="mso-bidi-font-weight: normal">囑Ş表示Q通常?strong style="mso-bidi-font-weight: normal">?/strong>(关系)?strong style="mso-bidi-font-weight: normal">点(其他模型元素)怺q接构成?/span>

c)        模型元素代表面向对象中的cR对象、消息和关系{概念,是构成图的基本概c(din)?/span>

d)        通用机制用于表示其他信息Q比如注释、模型元素的语义{?/span>

4.       UML用模型来描述pȝ的结构或静态特征,以及(qing)行ؓ(f)或动态特征,从不同的视角为系l架构徏模,形成不同视角Q?/span>

a)         用例视图(Use Case View)Q强调从用户角度看到的或需要的pȝ功能Q是被称为参与者的外部用户所能观察到的系l功能的模型图?/span>

b)        逻辑视图(Logical View)Q展现系l的静态或l构l成?qing)特征,也被UCؓ(f)l构模型视图(Structural Model View)或?strong style="mso-bidi-font-weight: normal">静态视?/strong>(Static View)?/span>

c)        q发视图(Concurrent View)Q体Cpȝ的动态或者行为特征,也称?strong style="mso-bidi-font-weight: normal">行ؓ(f)模型视图(Behavioral Model View)?strong style="mso-bidi-font-weight: normal">动态视?/strong>(Dynamic View)?/span>

d)        lg视图(Component View)Q体Cpȝ实现的结构和行ؓ(f)特征Q也UCؓ(f)实现模型视图(Implementation Model View)?/span>

e)         配置视图(Deployment View)Q体Cpȝ实现环境的结构和行ؓ(f)特征Q也被称?strong style="mso-bidi-font-weight: normal">环境模型视图(Environment Model View)或?strong style="mso-bidi-font-weight: normal">物理视图(Physical View)?/span>

5.       视图由图构成Q?/span>UML提供?/span>9U不同的图:(x)

a)         用例?/span>(Use Case Diagram)Q描q系l功能;

b)        cd(Class Diagram)Q描q系l的静态结构;

c)        对象?/span>(Object Diagram)Q描q系l在某个时刻的静态结构;

d)        时序?/span>(Sequence Diagram)Q按旉序描述pȝ元素间的交互Q?/span>

e)         协作?/span>(Collaboration Diagram)Q按照时间和I间序描述pȝ元素间的交互和他们之间的关系Q?/span>

f)         状态图(State Diagram)Q描qCpȝ元素的状态条件和响应Q?/span>

g)        zd?/span>(Activity Diagram)Q描qCpȝ元素的活动;

h)        lg?/span>(Component Diagram)Q描qC实现pȝ的元素的l织Q?/span>

i)          配置?/span>(Deployment Diagram)Q描qC环境元素的配|,q把实现pȝ的元素映到配置上?/span>

6.    囑֒视图之间的对应关p:(x)
用户模型视图Q用例图
l构模型视图Q类囑֒对象?/font>
行ؓ(f)模型视图Q时序图、协作图、状态图和活动图
实现模型视图Q组件图
环境模型视图Q配|图

7.       UML的两套徏模机Ӟ静态徏模机?/strong>?strong style="mso-bidi-font-weight: normal">动态徏模机?/strong>。静态徏模机制包括用例图、类图、对象图、包、组件图和配|图Q动态徏模机制包括消息、状态图、时序图、协作图、活动图?/span>



semovy 2007-05-16 17:50 发表评论
]]>
UML概述http://m.tkk7.com/WshmAndLily/articles/115715.htmlsemovysemovyMon, 07 May 2007 07:46:00 GMThttp://m.tkk7.com/WshmAndLily/articles/115715.htmlhttp://m.tkk7.com/WshmAndLily/comments/115715.htmlhttp://m.tkk7.com/WshmAndLily/articles/115715.html#Feedback0http://m.tkk7.com/WshmAndLily/comments/commentRss/115715.htmlhttp://m.tkk7.com/WshmAndLily/services/trackbacks/115715.html1.背景知识

1997q_(d)OMGl织Q?/span>Object Management Group对象理l织Q发布了l一建模语言Q?/span>Unified Modeling LanguageQ?/span>UMLQ?/span>UML的主要创始h?/span>Jim Rumbaugh?/span>Ivar Jacobson?/span>Grady Booch ,UML的目标之一是为开发团队提供标准通用的设计语a来开发和构徏计算机应用?/span>UML提出了一?/span>IT专业人员期待多年的统 一的标准徏模符受通过使用UMLQ这些h员能够阅d交流pȝ架构和设计规?/span>, UMLW号集只是一U语a而不是一U方法学. 2003q_(d)UML已经获得了业界的认同.

 

2.q?/span>

       UML捕捉了Y件系l有兛_{和理解,用来理解、设计、浏览、配|、维护以?qing)控制系l得信息.UML包括语义概念、标记符号和指南,据有静态、动态、环境上和组l性的部分.

<!--[if !supportLists]-->IQ?span>               <!--[endif]-->UML捕捉静态结构和动态行为的信息。系l徏模成独立对象的集合以?qing)它们交互和实现。静态结构定义各U对象和实现已经它们的关p,动态行为定义了对象间的通讯。可以从不同视角q行建模Q以不同视角理解pȝ?/span>

<!--[if !supportLists]-->IIQ?span>            <!--[endif]-->UML可以用包来组l模型结?/span>

 

3Q目?/span>

       UML不是完整的开发方法,它不包括逐步的开发流E。但UML包括了所有必要的概念来解决现代P代过E中解决用例驱动的需求?/span>

 

4Q?/span>UML概念范围

       IQ?/span>         静态结?/span>

       IIQ?/span>        动态行?/span>

<!--[if !supportLists]-->IIIQ?span>          <!--[endif]-->     实现构?/span>

<!--[if !supportLists]-->IVQ?span>          <!--[endif]-->    模型l织

<!--[if !supportLists]-->VQ?span>                <!--[endif]-->    扩展机制

      

5.   UML视图

       UML视图可以分ؓ(f)三个领域Q?span>l构型分cR动态行为和模型理

IQ结构性分cd括静态视图、用例视囑֒实现视图。它描述了系l中事物和事物之间的关系Q包括类、用例、构件和节点Qؓ(f)构徏动态行为提供了基础?/span>

       IIQ动态行为包括状态机视图、活动图和交互图。它描述了系l时间上的行?/span>

       IIIQ模型管理,用包来组l模型,Ҏ(gu)的包包括模型和子pȝQ模型视囑֒其它视图交PQؓ(f)团队工作和配|控制把它们l织h?/span>

       IVQ扩展,包括U束、版型和标签倹{?/span>



semovy 2007-05-07 15:46 发表评论
]]>
UML必懂Q?/title><link>http://m.tkk7.com/WshmAndLily/articles/106217.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sun, 25 Mar 2007 07:17:00 GMT</pubDate><guid>http://m.tkk7.com/WshmAndLily/articles/106217.html</guid><wfw:comment>http://m.tkk7.com/WshmAndLily/comments/106217.html</wfw:comment><comments>http://m.tkk7.com/WshmAndLily/articles/106217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/WshmAndLily/comments/commentRss/106217.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/WshmAndLily/services/trackbacks/106217.html</trackback:ping><description><![CDATA[1、活动图、类囄在详l设计。(详细设计和概要设计有些时候不是分的那么细Q?<br />2、顺序图、类图、构件图用在概要设计?<br />3、用例图、状态图是给客户看的?<br />4、顺序图是根据类图来ȝQ顺序图中的对象是类图中的类的实例,序图中一个对?<br />指向另一个对象的Ҏ(gu)是这个对象的Ҏ(gu)?<br /><br /><br /><br />5、三层结?1)界面c?我做好了一些按钮、文本框、标{Q分l一个初U程序员可以, <br />把界面规划好pQ对里面的业务不必关心?<br />(2)业务c?q就要给一个高U程序员来做Q主要是哪些cd现哪些方法就行?<br />(3)实体c?用业务来调用实体Q实体就是实实在在的东西?<br />注意:在界面类和业务类之间Q有q样一个,用中间的接口人, <br />可以是高U程序员,他要用struts把界面和业务联系h?<br />UML的课Eȝ <br /><br />UML是干什么的,是用来表达我们思想?我们的面向对象的思想. <br />想一?我们来到q个?是ؓ(f)了锻炼我们怎么ȝ立思?怎么d作的, <br />在设计的时?要有一个设计的理念,和设计的思想, <br />只有你自q的动脑去想了,那才是你自己?老师告诉? <br />那是老师?不是你的. <br />说一下九(ji)个图: <br /><br />一、需求阶D?1、用例图 (1)你画完了Q主要是用户能否看懂?<br />(2)你画的用例图里是不是覆盖了用户需求的每一个功能和要求?<br />   2、状态图 (1)在这个状态很重要的情况下Q要把它d来?<br />(2)很强调状态时需要画它?<br />二、设计阶D包括(概要设计和详l设计分公司而言Q?<br />       1、概要设?1)构g?@软g之间的和部v囑Ş成对比?<br />(2)时序?@宽广的时候用在概要设计?<br />(3)cd @ <br />(4)协作?@ <br />   2、详l设?1)cd @在这里面一定要写详l了Q让~码人员看完Q伪代码p出来Q伪代码是指一般用代码的格式表C程序执行过E和法Q但不能在编译器上通过~译的代码,目的是ؓ(f)了展C程序的执行q程。) <br />@每个cȝҎ(gu)Q属性都要写出来?<br />(2)zd?@逻辑复杂的时候要用到它,如果想练?fn)的话,可以用随机抽题这个来l?<br />(3)时序?@主要序Q就是必Lq个序来的?<br />(4)部v?@是强调硬件之间的和上面的构g囑Ş成对比?<br />重点Q?、用例图 <br />2、类?<br />3、时序图 <br />4、活动图 ·是给一个编码h员就可以做出来的东西Q每一句一句的译q来。不需要知道太多?<br /><br />q有一个要说的是:(x)计划q度表?<br />(1)需求从多长旉到多长时间?<br />(2)设计从多长时间到多长旉?<br />(3)~码从多长时间到多长旉?<br /><br /><p align="right">摘自 <a target="_blank"><font color="#000000">chenkaituo</font></a> 的BLOG</p><img src ="http://m.tkk7.com/WshmAndLily/aggbug/106217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/WshmAndLily/" target="_blank">semovy</a> 2007-03-25 15:17 <a href="http://m.tkk7.com/WshmAndLily/articles/106217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://yqstickers.com" target="_blank">޹ۺ91Ʒ鶹</a>| <a href="http://4438xa48.com" target="_blank">þù޾Ʒ</a>| <a href="http://by22877.com" target="_blank">ĻƵ</a>| <a href="http://microston.com" target="_blank">պƷƵ߹ۿ</a>| <a href="http://bjmyhfc.com" target="_blank">˾Ʒ</a>| <a href="http://uu313.com" target="_blank">AV鶹Խ</a>| <a href="http://yimintech.com" target="_blank">AVһ</a>| <a href="http://manghuo365.com" target="_blank">ݹѹǹ </a>| <a href="http://sy8989.com" target="_blank">޾Ʒmv߹ۿվ </a>| <a href="http://wx-jn.com" target="_blank">պa߹ۿ</a>| <a href="http://hucgjc.com" target="_blank">պһ</a>| <a href="http://szybzc.com" target="_blank">һƵ</a>| <a href="http://dunyny.com" target="_blank">˳վɫ߹ۿ</a>| <a href="http://yes5555.com" target="_blank">޹˾þþƷ </a>| <a href="http://3x79.com" target="_blank">޹++ۺ</a>| <a href="http://dou18.com" target="_blank">þþƷձľϣ</a>| <a href="http://3333kkkk.com" target="_blank">߲</a>| <a href="http://ti166.com" target="_blank">aƬ</a>| <a href="http://jiezinet.com" target="_blank">ؼëƬѲ</a>| <a href="http://517fanfan.com" target="_blank">˾Ʒŷ</a>| <a href="http://1314con.com" target="_blank">þþƷձҰ</a>| <a href="http://gyqcy.com" target="_blank">һ뾫Ʒɫ</a>| <a href="http://eaivan.com" target="_blank">ۺ</a>| <a href="http://paweax.com" target="_blank">ѹۿaƬվ</a>| <a href="http://400209.com" target="_blank">þþƷŮAVѹۿ</a>| <a href="http://hucgjc.com" target="_blank">ĻƷѾþ</a>| <a href="http://yiqigxfc.com" target="_blank">99Ů߹ۿ</a>| <a href="http://yiuzz.com" target="_blank">þ޾Ʒav</a>| <a href="http://gycat.com" target="_blank">ɫ͵͵޵һۺ</a>| <a href="http://34pmpm.com" target="_blank">޳a޳av</a>| <a href="http://12345ww.com" target="_blank">LƷþ </a>| <a href="http://www-8908.com" target="_blank">˵߲</a>| <a href="http://zhuanjiao521.com" target="_blank">޹ƷԲAV</a>| <a href="http://ljdst.com" target="_blank">޾ƷƷ벻99</a>| <a href="http://da666f.com" target="_blank">AVרAVͬ</a>| <a href="http://wankufan.com" target="_blank">avŷղһ</a>| <a href="http://www321fafa.com" target="_blank">97Ƶ</a>| <a href="http://www09191z.com" target="_blank">ĻmvѸƵ8 </a>| <a href="http://kssijia.com" target="_blank">Ƶ</a>| <a href="http://51a88.com" target="_blank">޾Ʒ</a>| <a href="http://minliusoft.com" target="_blank">츾ëXXXX</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>