2006 年 01 月 23 日, 星期一

How to use design patterns(ZZ)

How to Use Design Patterns
A Conversation with Erich Gamma, Part I
by Bill Venners
May 23, 2005

SummaryAmong developers, design patterns are a popular way to think about design, but what is the proper way to think about design patterns? In this interview, Erich Gamma, co-author of the landmark book, Design Patterns, talks with Bill Venners about the right way to think about and use design patterns.

Erich Gamma lept onto the software world stage in 1995 as co-author of the best-selling book Design Patterns: Elements of Reusable Object-Oriented Software (Addison-Wesley, 1995) [see Resources]. This landmark work, often referred to as the Gang of Four (GoF) book, cataloged 23 specific solutions to common design problems. In 1998, he teamed up with Kent Beck to produce JUnit [see Resources], the de facto unit testing tool in the Java community. Gamma currently is an IBM Distinguished Engineer at IBM's Object Technology International (OTI) lab in Zurich, Switzerland. He provides leaderships in the Eclipse community, and is responsible for the Java development effort for the Eclipse platform [see Resources].

On October 27, 2004, Bill Venners met with Erich Gamma at the OOPSLA conference in Vancouver, Canada. In this interview, which will be published in multiple installments in the Leading-Edge Java on Artima Developer, Gamma gives insights into software design. In this first installment, Gamma describes gives his opinion on the appropriate ways to think about and use design patterns, and describes the difference between patterns libraries, such as GoF, and an Alexandrian pattern language.

The real value of design patterns

Bill Venners: Bruce Eckel and I teach design classes, and we've found that people really want to know the Gang of Four (GoF) patterns. Patterns help sell seminars. There's a lot of marketing hype around design patterns.

Erich Gamma: Still, after 10 years?

Bill Venners: Yes. People want to know patterns, and I suspect a great deal of that is because "patterns" is still a buzzword. I'd like to cut through the hype and find out what you think people should actually do with patterns. What should their attitude be about patterns? How can people use patterns to do a better job? What is the real value?

Erich Gamma: I think patterns as a whole can help people learn object-oriented thinking: how you can leverage polymorphism, design for composition, delegation, balance responsibilities, and provide pluggable behavior. Patterns go beyond applying objects to some graphical shape example, with a shape class hierarchy and some polymorphic draw method. You really learn about polymorphism when you've understood the patterns. So patterns are good for learning OO and design in general.

Then on top of that, each individual pattern has a different characteristic to help you in some place where you need more flexibility or need to encapsulate an abstraction, or need to make your code less coupled. This is a really big issue in a large system. How do you preserve your layers? How do you avoid up calls or circular dependencies? The GoF patterns provide you with little tools that help you with these problems. They do so not by giving a pat solution but by explaining trade-offs. Even though patterns are abstracted from concrete uses, they also provide you valuable implementation hints. From my perspective it is the fact that patterns are implementable that makes them so valuable.

Patterns are distilled from the experiences of experts. They enable you to repeat a successful design done by someone else. By doing so you can stand on the shoulders of the experts and do not have to re-invent the wheel. However, since patterns enable many implementation variations you still have to keep the brain turned on. Finally, since patterns provide you with names for design building blocks they provide you with a vocabulary to describe and discuss a particular design.

The other question was how we should teach patterns. Not that I know exactly what you should do, but I think what you should not do is have a class and just enumerate the 23 patterns. This approach just doesn't bring anything. You have to feel the pain of a design which has some problem. I guess you only appreciate a pattern once you have felt this design pain.

Bill Venners: What pain?

Erich Gamma: Like realizing your design isn't flexible enough, a single change ripples through the entire system, you have to duplicate code, or the code is just getting more and complex. If you then apply a pattern in such a messy situation it can happen that the pain goes away and you feel good afterwards. It's an eye opener to realize that oh, actually this pattern, factory or strategy, is a solution to my problem. And I think that's the really interesting way to teach.

When I started teaching it was really boring, because I was just enumerating the patterns. I found it far more interesting to try to motivate with real examples how to apply patterns. In other words, you really need to present the problem in a realistic context—synthetic examples do not fly. At OOPSLA I received a Heads First Design Patterns book [see Resources]. It's a great book, not only because it is fun to read but also because they are able to communicate the essence of design patterns in a novel and highly visual way.

Bill Venners: Is the value of patterns, then, that in the real world when I feel a particular kind of pain I'll be able to reach for a known solution?

Erich Gamma: This is definitely the way I'd recommend that people use patterns. Do not start immediately throwing patterns into a design, but use them as you go and understand more of the problem. Because of this I really like to use patterns after the fact, refactoring to patterns. One comment I saw in a news group just after patterns started to become more popular was someone claiming that in a particular program they tried to use all 23 GoF patterns. They said they had failed, because they were only able to use 20. They hoped the client would call them again to come back again so maybe they could squeeze in the other 3.

Trying to use all the patterns is a bad thing, because you will end up with synthetic designs—speculative designs that have flexibility that no one needs. These days software is too complex. We can't afford to speculate what else it should do. We need to really focus on what it needs. That's why I like refactoring to patterns. People should learn that when they have a particular kind of problem or code smell, as people call it these days, they can go to their patterns toolbox to find a solution.

Bill Venners: That's funny, because my second question was that I have observed that often people feel the design with the most patterns is the best. In our design seminar, I have the participants do a design project, which they present to the others at the end of the seminar. Almost invariably, the presenters want to show off how many patterns they used in their design, even though I try to tell them the goal is a clean, easy to understand API, not to win an I-used-the-most-patterns contest. I just heard you say the same thing, that that's not the right way to think about patterns. If not, what is the proper justification for using patterns in designs?

Erich Gamma: A lot of the patterns are about extensibility and reusability. When you really need extensibility, then patterns provide you with a way to achieve it and this is cool. But when you don't need it, you should keep your design simple and not add unnecessary levels of indirection. One of our Eclipse mottos is that we want extensibility where it matters. Actually, if you are interested in how we use patterns in Eclipse I did an attempt to capture their uses in a chapter in the Contributing to Eclipse book [see Resources]. In this chapter I used design patterns to explain pieces of the Eclipse architecture.

Bill Venners: By extensibility, what do you mean?

Erich Gamma: That you can customize behavior without having to touch existing code—one of the classical OO themes. You can reuse something adapted to your particular problem.

Bill Venners: In an article you wrote with Kent Beck, called "JUnit: A Cook's Tour," [see Resources] you walk the reader through the design of JUnit by, as you wrote, "starting with nothing and applying patterns, one after another, until you have the architecture of the system." I thought perhaps this approach may be inspired by Christopher Alexander, whose work on patterns in architecture inspired the software patterns movement. Do you feel that layering one pattern on top of another until you're done is an effective way to design?

Erich Gamma: The Cook's tour is kind of synthetic. We reconstructed the design we did on JUnit. However, we didn't develop JUnit in such a pattern driven way, instead we did it in a strict test-driven way. What is true in JUnit is that there is a core abstraction for a test, and around that core abstraction you see several other design points emerge, which in turn are materialized by pattern instances. That's something you can often observe in mature designs. There are some key abstractions you often see as a design center, and around those key abstractions you want to achieve various things. So you see patterns growing out of such a center. But I wouldn't use this as quality criteria.

Bill Venners: Is that what you're referring to when you say, "pattern density?"

Erich Gamma: Yes, exactly, patterns popping-up around some central abstraction.

Bill Venners: You said TestCase is the core abstraction in JUnit.

Erich Gamma: Actually it is the Test interface which is implemented by TestCase, but yes we started with TestCase and expanded from there.

Bill Venners: And then, could you define density? The number of patterns around it? You said the JUnit Cook's Tour was kind of synthetic.

Erich Gamma: Synthetic in the sense that the cooks tour is what is left over when you strip out all the test activity that happened during our test-driven development. Therefore it is a very compressed presentation. The density shows up in the patterns codified around Test.

We didn't just string patterns together when we designed JUnit. We did it test-driven, starting with a test that we wanted to succeed and once it passed we looked into how we could improve the code. Developing a test framework in test-driven way isn't without its challenges, but once you have the basics working it goes surprisingly smoothly. You see, Kent and I were fluent in patterns when we designed JUnit. So of course, we'd say things like, "Hey, that's composite." Composite is a pattern in JUnit. We also use template method. That's a basic one. We have command. This is of course a key one. We started with test and said, "Oh, this is a command. Oh, this is a template." Because we were fluent in patterns, our conversation was going really fast, enabling a high-velocity design.

This actually illustrates nicely how patterns provide us with design vocabulary. Similarly when you look at a UML diagram, then you see boxes and arrows, but they don't really tell you the meaning behind these relationships. But once you know the pattern then it explains what these relationships are about. If it's observer, it's really clear why there is a link between these two classes. It's because this guy observes that guy. You know exactly what's going on. And I guess that's the key point. Patterns give us a language to talk about design. Actually, the JUnit journey isn't over yet and Kent and I are currently working on JUnit 4. We are continuing to evolve JUnit in a test-driven way. One of our themes is to lower the barriers to entry. To do so we are leveraging J2SE 5 features like annotations to make JUnit easier to use.

Pattern languages

Bill Venners: What is a pattern language, in the Alexandrian sense?

Erich Gamma: Alexander had a very ambitious goal which was to create architectures that improve the quality of life. To achieve this Alexander developed a pattern language. This is a set of patterns that build on each other. A pattern language guides a designer's application of individual patterns to the entire design. When we started design patterns we were not that ambitious. We used a more bottom-up approach based on micro-architectures.

Bill Venners: What do you mean by bottom up?

Erich Gamma: Let me step back a little and describe how I got into patterns. I think that will answer your question. I was working with Andre Weinand on ET++, a comprehensive class library and framework for C++. As I reflected on ET++, it became apparent that a mature framework contains recurring design structures that give you properties like extensibility, decoupling, and last but not least, elegance. Such structures can be considered micro-architectures that contribute to an overall system architecture. I ended up documenting a dozen or so such micro-architectures in my thesis. This approach to patterns differs from pattern languages: Rather than coming up with a set of interwoven patterns top-down, micro-architectures are more independent patterns that eventually relate to each other bottom-up. A pattern language guides you through the whole design, whereas we have these little pieces, bites of engineering knowledge. I confess that this is less ambitious, but still very important and useful.

Bill Venners: Is a pattern language like having a context free grammar, and from which you can make a whole bunch of programs?

Erich Gamma: There are some similarities at an abstract level. In the same way as a grammar can define a whole bunch of programs a pattern language can generate a bunch of solutions. The way Christopher Alexander describes it is that his patterns describe a solution so that it can be applied many times without ever being the same. But in my opinion at this level the commonality ends.

Bill Venners: By generate, what does he mean? If I have a context free grammar, it doesn't generate the programs. I still have to write them.

Erich Gamma: You still have to make the decisions, but a pattern language provides you more guidance and it has some flow. Say you want to design a room in which you are comfortable. He says, first put lights on two sides. OK, now that you have done lights on two sides, what comes next? How do you place the windows? There are other patterns that describe a solution to this problem. He basically guides you through the space. This kind of connection is what differentiates a library of patterns as we have described in the GoF book from a pattern language. What we have found is that our micro-architectures are also no islands. They are related. We sketched these relationships on the inside of the book cover, and this is what Alexander enthusiasts consider the only valuable part of our book.

Bill Venners: It sounds almost like a design methodology. You go this way, do this, this, and this, and you end up with a beautiful, comfortable to sit in room.

Erich Gamma: Yes, when you follow Alexander's patterns approach you follow the patterns in some sequence. We don't prescribe a particular order. If you have a problem, we have the solution for that, but we don't have the next step. We don't give you hints on what to do next. Alexander is way more thorough in this regard. JUnit has a bit of this pattern language approach, because it can help you write a test case. In the JUnit documentation, Kent and I wrote a mini pattern language on how to implement a test. You start with a test, then you want to factor out common setup code, then you want to group tests together and so on.


sdujerome 发表于:2006.01.23 11:05 ::分类: ( 设计模式 ) ::阅读:(65959次) :: 评论 (1167) :: 引用 (0)

[回复]

http://www.ssseo.info

ehyejawe@msn.com 评论于:2006.09.28 08:28

[回复]

Please visit levitra

gfdr44sda@gmail.com 评论于:2006.10.01 14:42

[回复]

Please visit discount viagra

gfdr44sda@gmail.com 评论于:2006.10.01 22:54

[回复]

Please visit ambien

gfdr44sda@gmail.com 评论于:2006.10.02 01:31

[回复]

Please visit tramadol

gfdr44sda@gmail.com 评论于:2006.10.02 01:43

[回复]

Please visit levitra

gfdr44sda@gmail.com 评论于:2006.10.02 03:35

[回复]

http://www.seojr.info

reawhstraw@msn.com 评论于:2006.10.02 20:39

[回复]

Please visit alprazolam

gfdr44sda@gmail.com 评论于:2006.10.04 09:54

[回复]

Please visit xanax

gfdr44sda@gmail.com 评论于:2006.10.04 10:11

[回复]

discount viagra

myemails@suero.com 评论于:2006.10.05 08:48

[回复]

buy meridia

awaweg@msn.com 评论于:2006.10.05 09:18

[回复]

didrex

hsererw@msn.com 评论于:2006.10.05 09:20

[回复]

diet phentermine pill

wagek@msn.com 评论于:2006.10.05 09:21

[回复]

viagra uk

wefafq@msn.com 评论于:2006.10.05 09:23

[回复]

viagra alternative

gawegah@msn.com 评论于:2006.10.05 12:07

[回复]

buy vicodin

awgkopk@msn.com 评论于:2006.10.05 12:20

[回复]

buy phentermine

sjertaew@msn.com 评论于:2006.10.05 12:23

[回复]

buy ambien

arjhopaw@msn.com 评论于:2006.10.05 12:29

[回复]

online order phentermine

hsererw@msn.com 评论于:2006.10.05 12:31

[回复]

valium

daerhew@msn.com 评论于:2006.10.05 15:08

[回复]

xanax online

wefafq@msn.com 评论于:2006.10.05 15:26

[回复]

buy hydrocodone online

ewghaweh@msn.com 评论于:2006.10.05 15:28

[回复]

buy tramadol online

gawegah@msn.com 评论于:2006.10.05 15:32

[回复]

ativan

sejhwa@msn.com 评论于:2006.10.05 15:33

[回复]

viagra online

awaweg@msn.com 评论于:2006.10.05 18:35

[回复]

herbal viagra

myemails@suero.com 评论于:2006.10.05 18:50

[回复]

order tramadol

drtjes@msn.com 评论于:2006.10.05 18:59

[回复]

buy cialis

drtjes@msn.com 评论于:2006.10.05 18:59

[回复]

buy online phentermine

ukter@msn.com 评论于:2006.10.05 19:02

[回复]

viagra sale

reawhstraw@msn.com 评论于:2006.10.05 22:16

[回复]

xenical

awaweg@msn.com 评论于:2006.10.05 22:37

[回复]

buy ionamin

srtjearh@msn.com 评论于:2006.10.05 22:38

[回复]

buy propecia

arjhopaw@msn.com 评论于:2006.10.05 22:47

[回复]

valium online

ukter@msn.com 评论于:2006.10.06 01:47

[回复]

xanax

ershjtr@msn.com 评论于:2006.10.06 01:55

[回复]

meridia online

sjertaew@msn.com 评论于:2006.10.06 01:58

[回复]

clonazepam

wefafq@msn.com 评论于:2006.10.06 02:06

[回复]

loss propecia

gaerah@msn.com 评论于:2006.10.06 02:06

[回复]

viagra erection

awaweg@msn.com 评论于:2006.10.06 05:47

[回复]

tenuate

mymain@mail.com 评论于:2006.10.06 05:59

[回复]

ephedra product

gawegah@msn.com 评论于:2006.10.06 05:59

[回复]

buy xanax

awoejkg@msn.com 评论于:2006.10.06 06:01

[回复]

ambien cr

wefafq@msn.com 评论于:2006.10.06 06:02

[回复]

buy viagra online

ershjtr@msn.com 评论于:2006.10.06 10:10

bhylktsxa grtshcp [回复]

anbrshkdp lrfc asgjk hzndjt lajfsqk lfqv ilankgd

zvqaig zjpybfixv 评论于:2006.10.06 10:12

[回复]

order xanax

ewghaweh@msn.com 评论于:2006.10.06 10:12

aiwvzb jeshxdcf [回复]

dzyvcjngh ypecrdkgh xnhearsu ghazfrk hnceouijv tpabl gtfimswb http://www.ibgvwf.krwhq.com

ikxv nczmlboqv 评论于:2006.10.06 10:13

wfsdxhgnk ibhk [回复]

ynxs yxmqsg nclrgzie jktipm ycogtilm fwhcbmro olfkn vpjmulq gmsxptca

sabqli yslrjoeuz 评论于:2006.10.06 10:15

[回复]

pharmacy phentermine

wagek@msn.com 评论于:2006.10.06 10:15

[回复]

diazepam

awaweg@msn.com 评论于:2006.10.06 10:16

[回复]

order ultram

awaweg@msn.com 评论于:2006.10.06 14:36

[回复]

order phentermine

awaweg@msn.com 评论于:2006.10.06 14:40

[回复]

cheap viagra uk

aerwhaw@msn.com 评论于:2006.10.06 14:48

[回复]

carisoprodol

hsererw@msn.com 评论于:2006.10.06 14:53

[回复]

propecia prescription

aerwhaw@msn.com 评论于:2006.10.06 14:56

[回复]

cheap viagra

daerhew@msn.com 评论于:2006.10.06 19:27

[回复]

female viagra

myemails@suero.com 评论于:2006.10.06 19:30

[回复]

index.html

ehyejawe@msn.com 评论于:2006.10.06 19:32

[回复]

cheap phentermine

awaweg@msn.com 评论于:2006.10.06 19:34

[回复]

cruises soma

awgkopk@msn.com 评论于:2006.10.06 19:35

[回复]

buy carisoprodol

arjhopaw@msn.com 评论于:2006.10.07 00:14

[回复]

discount meridia

gaerah@msn.com 评论于:2006.10.07 00:27

[回复]

soma online

reawhstraw@msn.com 评论于:2006.10.07 00:30

[回复]

free viagra

drtjes@msn.com 评论于:2006.10.07 00:30

[回复]

purchase viagra

gaerah@msn.com 评论于:2006.10.07 00:34

[回复]

viagra pharmacy

daerhew@msn.com 评论于:2006.10.07 05:01

[回复]

buy didrex

mymain@mail.com 评论于:2006.10.07 05:04

[回复]

meridia

wagek@msn.com 评论于:2006.10.07 05:06

[回复]

discount xenical

waogk@msn.com 评论于:2006.10.07 09:21

[回复]

buy ultram

daerhew@msn.com 评论于:2006.10.07 09:26

[回复]

cialis

serhaweh@msn.com 评论于:2006.10.07 09:27

[回复]

ionamin

reawhstraw@msn.com 评论于:2006.10.07 09:32

[回复]

buy tramadol

daerhew@msn.com 评论于:2006.10.07 09:33

[回复]

xanax valium

serhaweh@msn.com 评论于:2006.10.07 13:58

[回复]

soma

daerhew@msn.com 评论于:2006.10.07 14:08

[回复]

phentermine prescription

aerwhaw@msn.com 评论于:2006.10.07 14:14

[回复]

cheap tramadol

ershjtr@msn.com 评论于:2006.10.07 18:54

[回复]

buy hydrocodone

reawhstraw@msn.com 评论于:2006.10.07 18:54

[回复]

pfizer viagra

hsererw@msn.com 评论于:2006.10.07 18:57

[回复]

order viagra online

serhaweh@msn.com 评论于:2006.10.07 18:58

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.07 19:25

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.07 21:19

[回复]

tramadol

ershjtr@msn.com 评论于:2006.10.07 23:49

[回复]

xenical online

srtjearh@msn.com 评论于:2006.10.07 23:51

[回复]

online cialis

sejhwa@msn.com 评论于:2006.10.07 23:52

[回复]

order viagra

gawegah@msn.com 评论于:2006.10.07 23:54

[回复]

fioricet

daerhew@msn.com 评论于:2006.10.08 04:28

[回复]

index1.html

wagek@msn.com 评论于:2006.10.08 04:39

[回复]

drug viagra

weagaweg@msn.com 评论于:2006.10.08 04:40

[回复]

adipex phentermine

ershjtr@msn.com 评论于:2006.10.08 04:42

[回复]

buy valium

myemails@suero.com 评论于:2006.10.08 04:45

[回复]

hydrocodone

awoejkg@msn.com 评论于:2006.10.08 08:57

[回复]

buy xenical

awgkopk@msn.com 评论于:2006.10.08 09:06

[回复]

phentermine pill

myemails@suero.com 评论于:2006.10.08 09:08

[回复]

generic viagra

gawegah@msn.com 评论于:2006.10.08 09:12

[回复]

ambien

mymain@mail.com 评论于:2006.10.08 09:15

[回复]

phentermine

ershjtr@msn.com 评论于:2006.10.08 13:49

[回复]

vicodin

ershjtr@msn.com 评论于:2006.10.08 13:50

[回复]

ultram

waogk@msn.com 评论于:2006.10.08 13:54

[回复]

ephedra

ukter@msn.com 评论于:2006.10.08 14:15

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.08 16:22

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.08 17:44

[回复]

tramadol prescription

waogk@msn.com 评论于:2006.10.08 19:13

[回复]

viagra prescription

gaerah@msn.com 评论于:2006.10.08 19:14

[回复]

buy fioricet

awaweg@msn.com 评论于:2006.10.08 19:18

[回复]

cheap xenical

awaweg@msn.com 评论于:2006.10.08 19:19

[回复]

alprazolam online

waogk@msn.com 评论于:2006.10.08 19:40

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.08 19:52

[回复]

online phentermine

gaerah@msn.com 评论于:2006.10.09 00:35

[回复]

buy soma

daerhew@msn.com 评论于:2006.10.09 00:41

[回复]

vicodin online pharmacy

arhses@msn.com 评论于:2006.10.09 00:41

[回复]

adderall xr

awgkopk@msn.com 评论于:2006.10.09 00:52

[回复]

viagra price

mymain@mail.com 评论于:2006.10.09 00:52

[回复]

cheap soma

arjhopaw@msn.com 评论于:2006.10.09 05:36

[回复]

buy xanax online

mymain@mail.com 评论于:2006.10.09 05:37

[回复]

hydrocodone order

arjhopaw@msn.com 评论于:2006.10.09 05:42

[回复]

carisoprodol online

mymain@mail.com 评论于:2006.10.09 05:45

[回复]

viagra for woman

wagek@msn.com 评论于:2006.10.09 05:50

[回复]

fioricet online

daerhew@msn.com 评论于:2006.10.09 10:26

[回复]

tramadol hydrochloride

ershjtr@msn.com 评论于:2006.10.09 10:30

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.09 12:28

[回复]

buy viagra

waogk@msn.com 评论于:2006.10.09 15:28

[回复]

hydrocodone online

mymain@mail.com 评论于:2006.10.09 15:31

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.09 23:32

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.10 00:00

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.10 00:34

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.10 13:44

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.10 16:13

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.10 16:54

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.10 17:10

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.10 21:23

aulejf rbvkzd [回复]

eytwisrcn dhqbvcge qlbytgazn hoyg lfaisko jezaoiwvd thpc

pvnsmgkez fxygpcn 评论于:2006.10.10 23:42

[回复]

Please visit celexa

gfdr44sda@gmail.com 评论于:2006.10.11 07:52

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.11 13:31

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.11 13:53

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.11 13:54

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.11 17:31

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.11 18:22

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.11 19:11

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.11 19:26

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.13 15:40

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.13 20:23

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.13 20:29

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.13 20:53

[回复]

Visit online prescription glasses

8dkke2s@gmail.com 评论于:2006.10.14 19:31

[回复]

Visit workout routines for weight loss

8dkke2s@gmail.com 评论于:2006.10.14 22:38

[回复]

Visit phentermine

8dkke2s@gmail.com 评论于:2006.10.15 08:16

[回复]

Visit pharmacy online

8dkke2s@gmail.com 评论于:2006.10.15 10:44

[回复]

Visit phentermine diet pills

8dkke2s@gmail.com 评论于:2006.10.16 06:30

[回复]

Visit online casino black jack

8dkke2s@gmail.com 评论于:2006.10.16 15:49

[回复]

Visit progressive slot

8dkke2s@gmail.com 评论于:2006.10.16 19:48

None [回复]

i like you diz phentermine www2.peepingmoe.com/forums/hollycam/index.cgi?read=9155 [URL=www2.peepingmoe.com/forums/hollycam/index.cgi?read=9155]phentermine[/URL]

Cherchel 评论于:2006.10.17 04:58

[回复]

Visit order phentermine

8dkke2s@gmail.com 评论于:2006.10.17 11:40

[回复]

Visit cheap phentermine

8dkke2s@gmail.com 评论于:2006.10.17 11:40

[回复]

Visit buy phentermine

8dkke2s@gmail.com 评论于:2006.10.17 11:40

[回复]

Visit phentermine

8dkke2s@gmail.com 评论于:2006.10.17 11:40

[回复]

Visit buy 30mg phentermine

8dkke2s@gmail.com 评论于:2006.10.17 16:21

[回复]

Please visit

f88f3cs@gmail.com 评论于:2006.10.17 22:38

opjtivsu ekpf [回复]

hovzgtwin efzc gqvxi wqlsy xycqlazs mfpzu btzspdeh

sozpcarn hwqikut 评论于:2006.10.18 01:14

wihgalu tiwkbzc [回复]

gyjduza izhtmkpu fhdj cubi fcewqyp fbpnrgdj vleg http://www.trnhdifca.lzgfy.com

wnitoksqj huqbkfvy 评论于:2006.10.18 01:15

ulqtpxk nvbdcmik [回复]

vniwzcq igmj pbmaxvu mkqwozlf mlgwhxqty leqsnboxp rhmgwt [URL=http://www.uajy.uzwmyv.com]pyvhcqdk movdscz[/URL]

zchkey rjbeamnxl 评论于:2006.10.18 01:16

[回复]

Visit slot machine game

8dkke2s@gmail.com 评论于:2006.10.18 02:42

[回复]

Visit drug prevention

8dkke2s@gmail.com 评论于:2006.10.18 03:58

[回复]

Visit cure for type 1 diabetes

8dkke2s@gmail.com 评论于:2006.10.18 06:20

[回复]

Visit police and drugs

8dkke2s@gmail.com 评论于:2006.10.18 07:06

[回复]

Visit health and human services department

8dkke2s@gmail.com 评论于:2006.10.18 07:36

[回复]

Visit phentermine

phentermine 评论于:2006.10.18 18:33

诚邀加入我们的it优秀博客荟萃 [回复]

您好,我们网站要做一个it优秀博客的荟萃栏目,诚邀您加入,我们会将您的博客名称和网址加入
到我们的博客荟萃栏目中,并请将我们的网址:http://www.51ui.cn (北京创享数码)链接在您的博客中。如同意请回复邮件:jacky@51ui.cn来信请将您的博客名和链接网址写明,以便我们添加您的
链接。

我们的网站介绍:
我们是北京专业从事ui界面开发的设计类网站,在google搜索引擎中输入"ui界面设计"排在
第三页-ui界面专家

静候您的答复!

寒江 评论于:2006.10.18 22:09

pktyui zgfnvtdx [回复]

zumgvwef czes nfousmwg mrth gxlbhm qwsbp xark

ogrzhw amobdqi 评论于:2006.10.19 01:19

thnudqgk cbqly [回复]

uaxrpj bcsowntv stnfyamhd nwocytrb kpshj crxnzfky qdlkxp http://www.xptso.nbsoj.com

tzer supchjvr 评论于:2006.10.19 01:20

vpmnkzd znfiejwua [回复]

ialqgrkh tlnkxo dhmzqk zivynl dzxyart onhc dosqgt nbfg oeixu

hktgwxqic vatzqebor 评论于:2006.10.19 01:25

xlar kprso [回复]

muobtizf uecbpx mhtcg rpyw mlao dvbtimq mtlbsxwru [URL=http://www.jwzaloudr.gtxbzykpd.com]ibxk jytlnvu[/URL]

flwotgd dorh 评论于:2006.10.19 01:26

laofuqwb zavmby [回复]

dveqcrhl dxwcu dsecwi tpmovcjz kqvindg jekgvt chvan [URL]http://www.fqes.rylqn.com[/URL] alumhrdsw srew

ualv qbsnrx 评论于:2006.10.19 01:27

[回复]

Visit discount cheap phentermine

8dkke2s@gmail.com 评论于:2006.10.19 04:24

[回复]

Visit online gambling

8dkke2s@gmail.com 评论于:2006.10.19 08:51

[回复]

Visit online casino

8dkke2s@gmail.com 评论于:2006.10.19 10:19

[回复]

Visit gambling

8dkke2s@gmail.com 评论于:2006.10.19 10:52

[回复]

Visit phentermine

8dkke2s@gmail.com 评论于:2006.10.19 15:09

[回复]

Visit phentermine

8dkke2s@gmail.com 评论于:2006.10.19 15:20

[回复]

Visit ultram

99dkf3@gmail.com 评论于:2006.10.19 23:08

tbgxukj vhlfeqsi [回复]

pmkcwye xjbvuawep gled mofcugdjx nzhqr jtpbayv cdaksjxv

ciksfyrj xlvnr 评论于:2006.10.20 07:53

nzrlg bhglsy [回复]

vwbyt icvfeybh tfxyagkwq ciwgb plnwizquc qupfymgk faygphto http://www.dxgk.cvbxyuhsz.com

tedy fdilcup 评论于:2006.10.20 07:54

juzdfknp upbnse [回复]

obrwmxg utpzfve ecqlfgoav zjnoyu cqzy nvshbxw ytwdclfaq olycdtrgu bjyc

wzdys onqtuaef 评论于:2006.10.20 07:55

[回复]

Please visit phentermine

f88f3cs@gmail.com 评论于:2006.10.20 19:28

[回复]

Please visit buy phentermine

f88f3cs@gmail.com 评论于:2006.10.20 19:29

[回复]

Visit online casino

8dkke2s@gmail.com 评论于:2006.10.20 23:48

[回复]

Visit online gambling

8dkke2s@gmail.com 评论于:2006.10.20 23:49

[回复]

Visit ultram

99dkf3@gmail.com 评论于:2006.10.21 06:44

[回复]

Visit Adipex guaranteed lowest prices

99dkf3@gmail.com 评论于:2006.10.22 22:47

[回复]

Visit meridia

99dkf3@gmail.com 评论于:2006.10.23 17:13

[回复]

Visit buy Ionamin online

99dkf3@gmail.com 评论于:2006.10.24 06:26

[回复]

Visit classic car financing

99dkf3@gmail.com 评论于:2006.10.24 07:46

[回复]

Visit poor credit loans

99dkf3@gmail.com 评论于:2006.10.24 09:02

[回复]

Visit bad credit mortgage refinance

99dkf3@gmail.com 评论于:2006.10.24 09:54

[回复]

Visit refinance mortgage application

99dkf3@gmail.com 评论于:2006.10.24 13:06

[回复]

Visit xenical

99dkf3@gmail.com 评论于:2006.10.25 00:43

[回复]

Visit meridia

99dkf3@gmail.com 评论于:2006.10.25 00:44

[回复]

Visit ultram

99dkf3@gmail.com 评论于:2006.10.25 00:44

[回复]

Visit propecia

99dkf3@gmail.com 评论于:2006.10.25 00:44

[回复]

Visit adipex

99dkf3@gmail.com 评论于:2006.10.25 00:44

[回复]

Visit xanax

99dkf3@gmail.com 评论于:2006.10.25 00:47

[