Purpose Scope Factory Method Adapter Abstract Factory Builder
设计模式的分类表: Purpose目的 创建型 Scope 范围 类 结构型 Factory Method Adapter 对象 Abstract Factory Builder Prototype Singleton Adapter Bridge Composite Decorator Facade Flyweight Proxy 行为型 Interpreter Template Method Chain of Responsibility Command Iterator Mediator Memento Observer State Strategy 8 Visitor
• 行为型模式包括: – – – Chain of Responsibility(职责链) Command(命令) Interpreter(解释器) Iterator(迭代器) Mediator(中介者) Memento(备忘录) Observer(观察者) State(状态) Strategy(策略) Template method(模板方法) Visitor(访问者) 12
• 引入Facade对象后Client和子系统之间通信关 系的变化: client classes subsystem classes 17
Java中使用数据库的一般过程: 1. 装载数据库驱动程序 try { Class. for. Name(driver); } catch (Exception e) { System. out. println (e. get. Message()); } 23
2. 利用Connection类(接口)连接数据库,如 果必要,获取数据库的元数据信息。 try { con = Driver. Manager. get. Connection(url); dma = con. get. Medata. Data(); } catch (Exception e) { System. out. println(e. get. Message()); } 24
3. 可以利用dma对象(类型为Database. Metadata) 获取数据库的表名。 Vector tname = new Vector(); try { results = new result. Set (dma. get. Tables(catalog, null, “%”, types)); } catch (Exception e) { System. out. println(e); } While (results. has. More. Elements()) { tname. add. Element(result. get. Column. Value(“TABLE_NAME”)); } 25
Client Database Connection Database Metadata result. Set Statement Result. Set Metadata Result. Set 27
Database类的定义 class Database { public Database (String driver) (); public void open (String url, String cat); public String[] get. Table. Names(); public String[] get. Column. Names(String table); public String get. Column. Value (String table, String column. Name); public String get. Next. Value(String column. Name); public result. Set execute (String sql); } 28
result. Set类的定义: class result. Set { public result. Set(Result. Set rset)(); public String[ ] get. Meta. Data(); public boolean has. More. Element(); public String[ ] next. Element(); public String get. Column. Value(String column. Name); public String get. Column. Value(int i); } 说明:对数据库的一般操作可通过类Database和 result. Set进行,减低了客户程序和数据库操作类的耦 合关系,如果需要一些特殊的操作,客户程序也可以 29 调用数据库操作类中的方法。
Abstract Factory的一般结构 38
说明: • Abstract Factory设计模式中的参与者为 – Abstract. Factory – Concrete. Factory – Abstract. Product – Concrete. Product – Client • 客户类仅使用由Abstract. Factory和 Abstract. Product 声明的接口。 39
说明:Visitor设计模式中的参与者包括: – Visitor – Concrete. Visitor – Element – Concrete. Element – Object. Structure:能遍历它的元素。 49
• 一个visitor对象可以访问不具有相同父类的 对象。 例: class Visitor { //… public abstract void visit. My. Type (My. Type element); public abstract void visit. Your. Type (Your. Type element); } 51
Visitor设计模式所生成的Java代码 • 共生成七个文件: – Visitor. java – Element. java – Concrete. Element. A. java – Concrete. Element. B. java – Concrete. Visitor 1. java – Concrete. Visitor 2. java – Object. Structure. java • 所生成的代码如下所示(生成代码所依据 的类图不采用Rose所提供的设计模式): 53
1. Visitor. java的源代码: public abstract class Visitor { public Visitor() { } public abstract void visit. Concrete. Element. A(Concrete. Element. A element); public abstract void visit. Concrete. Element. B(Concrete. Element. B element); } 54
2. Element. java的源代码: public abstract class Element { public Element() { } public abstract void accept(Visitor v); } 55
3. Concrete. Element. A. java的源代码: public class Concrete. Element. A extends Element { public Concrete. Element. A() { } public void accept(Visitor v) { } public void operation. A() { } } 56
4. Concrete. Element. B. java的源代码: public class Concrete. Element. B extends Element { public Concrete. Element. B() { } public void accept(Visitor v) { } public int operation. B() { return 0; } } 57
5. Concrete. Visitor 1. java的源代码: public class Concrete. Visitor 1 extends Visitor { public Concrete. Visitor 1() { } public void visit. Concrete. Element. A(Concrete. Element. A element) { } public void visit. Concrete. Element. B(Concrete. Element. B element) { } } 58
6. Concrete. Visitor 2. java的源代码: public class Concrete. Visitor 2 extends Visitor { public Concrete. Visitor 2() { } public void visit. Concrete. Element. A(Concrete. Element. A element) { } public void visit. Concrete. Element. B(Concrete. Element. B element) { } } 59
7. Object. Structure. java的源代码: public class Object. Structure { public Element the. Element; public Object. Structure() { } } 60
Visitor设计模式所生成的Java代码 • 共生成八个文件: – A_Visitor. java – A_Concrete. Visitor_A. java – A_Concrete. Visitor_B. java – A_Element. java – A_Concrete. Elemnet_B. java – A_Object. Structure. java – A_Client. java 67
1. A_Visitor. java的源代码: //Source file: F: \code\A_Visitor. java public abstract class A_Visitor { /** * @roseuid 3 FD 6 D 6 E 4001 B */ public A_Visitor() { } /** * @param the. A_Concrete. Element_B * @roseuid 3 FD 6 D 29 F 0087 */ public abstract void visit(A the. A, A_Concrete. Element_B the. A_Concrete. Element_B); 68 }
2. A_Concrete. Visitor_A. java的源代码 //Source file: F: \code\A_Concrete. Visitor_A. java public class A_Concrete. Visitor_A extends A_Visitor { /** * @roseuid 3 FD 6 D 6 E 401 B 5 */ public A_Concrete. Visitor_A() { } /** * @param the. A_Concrete. Element_B * @roseuid 3 FD 6 D 29 F 02 C 2 */ 69
public void visit(A the. A, A_Concrete. Element_B the. A_Concrete. Element_B) { //TO DO: Overload (copy and paste) this operation as often as necessary, // typically once for each class selected for: // the. Concrete. Element participant: // A_Concrete. Element_B // Reduce the argument set for each operation as applicable. //TO DO: Replicate/modify the above code as necessary to process all, // required combinations of arguments for each of: // the. Concrete. Element participant: // the. A_Concrete. Element_B } } 70
3. A_Concrete. Visitor_B. java的源代码 类似于A_Concrete. Visitor_A. java的源代码 71
4. A_Element. java的源代码 //Source file: F: \code\A_Element. java public abstract class A_Element { /** * @roseuid 3 FD 6 D 6 E 40300 */ public A_Element() { } /** * @param visitor * @roseuid 3 FD 6 D 29 F 0127 */ public abstract void accept(A_Visitor visitor); } 72
5. A. java的源代码 //Source file: F: \code\A. java public class A extends A_Element { /** * @roseuid 3 FD 6 DEB 5009 A */ public A() { } } /** * @param visitor * @roseuid 3 FD 6 DE 3801 BD */ public void accept(A_Visitor visitor) { //visitor. visit(this); } 73
6. A_Concrete. Elemnet_B. java的源代码 //Source file: F: \code\A_Concrete. Element_B. java public class A_Concrete. Element_B extends A_Element { /** * @roseuid 3 FD 6 D 6 E 5018 F */ public A_Concrete. Element_B() { } } /** * @param visitor * @roseuid 3 FD 6 D 29 F 025 E */ public void accept(A_Visitor visitor) { //visitor. visit(this); } 74
7. A_Object. Structure. java的源代码 //Source file: F: \code\A_Object. Structure. java public class A_Object. Structure { public A_Element the. Element; /** * @roseuid 3 FD 6 D 6 E 403 C 8 */ public A_Object. Structure() { } } 75
8. A_Client. java的源代码 //Source file: F: \code\A_Client. java public class A_Client { /** * @roseuid 3 FD 6 D 6 E 3027 C */ public A_Client() { } } 76
End 77
- Slides: 77