设计模式例程描述与分析

内  容

一、背景\r\n二、什么是设计模式\r\n三、为什么使用设计模式\r\n四、如何学习和分析设计模式\r\n五、如何描述设计模式\r\n六、基础\r\n七、设计模式分析举例\r\n八、Jive Forum及其中的设计模式\r\n九、问题和讨论

一、背  景

目前企业级分布式软件开发普遍采用面向对象的方法,OOD直接导致了设计模式的发展。\r\n开发面向对象的软件是困难的,而开发可复用的面向对象的软件更难[1]。\r\n有经验的设计者使用重用过去的方案。\r\n采用设计模式使设计和代码具有良好的可维护性、可复用性和可升级性。

背  景

“Design patterns help you learn from others‘ successes instead of your own failures.” by Mark Johnson 。

二、什么是设计模式

1970s ,Christopher Alexander 的建筑师 提出设计模式概念。\r\n直到 1987,一些设计模式的论文和文章出现了 。\r\n1995年 ,GOF 发表了书: 《设计模式-可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software )

Gof(Gang of Four)的设计模式

定义:模式是在一个上下文中,对一个问题的解决方案。即模式的四要素:名字、上下文、问题和解决方案。\r\n分类:23种设计模式:\r\n 创建型:5种\r\n 结构型:7种\r\n 行为型:11种

三、为什么使用设计模式

尽力用一种标准的方式描述设计经验\r\n为设计者提供一种通用的语言\r\n增加复用性,减少设计的多样性\r\n增强设计变更的灵活性\r\n提高设计文档的质量\r\n增强设计的可理解性

四、如何学习使用设计模式

使用工具:面向对象语言开发运行环境(C  /java)、UML建模工具(Rose)\r\n理解各种设计模式(Gof的23种设计模式)描述的基本概念\r\n分析典型的应用(JDK核心类库、扩展类库、j2ee平台、jive forum、petstore、tomcat、等)\r\n不断实践

五、如何描述模式

目的:简要描述模式的目的。\r\n使用场合:典型的应用场合\r\n结构:采用UML语言中的类图(或对象图)进行描述。\r\n模式检验:可执行的Java程序代码。\r\n分析:进一步的分析,以及与其他模式的比较\r\n例程。

六、基本基础

面向对象基本概念:\r\n     从这里入手:\r\n Circle acircle ;\r\n         acircle = new Circle(10,10,100);\r\n    类:Circle\r\n      对象引用: acircle \r\n      实例化: new Circle(10,10,100)\r\n      实例(对象)

基本基础-关系

七、例程1 适配器(Adaptor)模式

目的:\r\n把一个类用用户希望的形式描述;即用用户希望的接口适配这个类。\r\n在这个模式中,这个类叫做被适配者(Adaptee),用户定义的接口叫适配接口,用户实现适配接口的类叫适配器(Adaptor)。\r\n也叫做,包装器(Wrapper)。

例子:动物图形编辑器

我们的程序

现成的程序

重用

策略1-对象适配器

适配器\r\n采用对象复合

策略1-对象适配器

//这是个适配器程序,适配Tiger使其具有Tookit的接口\r\npublic class TigerAdaptor implements Tookit \r\n{\r\n   public Tiger theTiger;\r\n   public TigerAdaptor(Tiger t) \r\n   {\r\n   theTiger=t;\r\n   }\r\n   public void draw() \r\n   {\r\n    theTiger.paint();\r\n   }\r\n}

策略2-类适配器

适配器\r\n采用类继承

策略2-采用继承

public class TigerAdaptor1 extends Tiger implements Tookit \r\n{\r\n   public TigerAdaptor1() \r\n   {\r\n   }\r\n   \r\n   public void draw() \r\n   {\r\n   super.paint();\r\n   }\r\n}

Adapter的一般结构

另一个Adapter实例

例程2 观察者(Observer)模式

目的:\r\n在多个对象之间建立一对多的关系,当一个对象改变时,其它所有的依赖对象自动发生改变。\r\n这个对象叫作被观察者(Subject),其它依赖的对象叫做观察者(Observer)。\r\n也叫作:Dependents, Publish-Subscribe, Model-View

使用场合

内容和显示分离,视图同步。如:

MVC结构

MVC结构

使用java.util.Observer和java.util.Observable

使用java.util.Observer

import java.util.*;\r\npublic class ConcreteSubject extends Observable{\r\n private String name;\r\n private float price;\r\n public ConcreteSubject(String name, float price) {\r\n this.name = name;\r\n this.price = price;\r\n System.out.println("ConcreteSubject ConcreteSubject created: "   name   " at "   price); \r\n }\r\n public String getName() {\r\n return name; \r\n }\r\n public float getPrice() {\r\n return price; \r\n }\r\n public void setName(String name) {\r\n this.name = name; \r\n setChanged ();\r\n notifyObservers(name);\r\n }\r\n public void setPrice(float price) {\r\n this.price = price;\r\n setChanged();\r\n notifyObservers(new Float(price));\r\n }\r\n}

ConcreteSubjectg.java

PriceObserver.java

import java.util.*;\r\npublic class PriceObserver implements Observer {\r\n private float price;\r\n public PriceObserver() {\r\n price = 0;\r\n System.out.println("Price Observercreated: Price currently "   price);\r\n }\r\n public void update(Observable obj, Object arg) {\r\n if (arg instanceof Float) {\r\n price = ((Float)arg).floatValue();\r\n System.out. println("PriceObserver : "   price); \r\n }\r\n }\r\n}

创建型设计模式

Singleton,产生一个类的唯一实例。\r\nSimple Factory,用Factory的同一种方法产生不同子类的对象\r\nFactory Method,用Factory不同的子类的不同方法,创建同类的不同子类的对象,又称为Polymorphic Factory 。\r\nAbstract Factory用Factory不同的子类的不同方法,创建不同类的不同子类的对象。

简单Factory

Factory Method

Abstract Factory

八、Jive Forum中的设计模式

安装运行环境\r\nJava运行环境:jdk1.3.1\r\n应用服务器:tomcat4.0.4\r\nWeb应用:Jive Forums Basic Version: 2.5.4\r\n  数据库:cloudscape3.6.4