常见GoF设计模式1.doc_第1页
常见GoF设计模式1.doc_第2页
常见GoF设计模式1.doc_第3页
常见GoF设计模式1.doc_第4页
常见GoF设计模式1.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

常用GoF设计模式-1为了实现分离,一般需要从“纵向”、“横向”、“核心和外围”三个不同的方面进行仔细地地分析和考虑。对于纵向进行分离,常用的处理方法是“分层策略”,或者某些框架技术。对于同一层中各个组件类之间的横向关联关系的分离,常用的处理方法是使用“桥模式”。对于核心功能模块和将要扩展的外围模块之间的分离,常用的处理方法是使用“装饰器模式”。1. 基本概念1.1 GoF设计模式展示的设计原则GoF设计模式展示了如何处理各种变化,使代码获得最大的可重用性。主要体现以下3种设计策略。针对接口编程,而不是针对具体的实现类编程。优先使用对象组合,而不是类的继承技术。将系统中的“可变部分”和“不可变部分”分离,封装变化点。1.2 GoF设计模式分为几大泛型1.2.1 创建型模式创建型模式涉及对象实例化时使用的各种模式,有以下几种:(1)工厂方法(Factory Method)(2)抽象工厂(Abstract Factory)(3)原型(Prototyoe)(4)生成器(Builder)(5)单例(Singleton)1.2.2 结构型模式结构型模型主要描述系统中的类和对象应该怎样结合以构成更大的结构,有以下几种:(1)门面(Facade)(2)代理(Proxy)(3)适配器(Adapter)(4)组合(Composite)(5)装饰(Decorator)(6)桥(Bridge)(7)享元(Flyweight)1.2.3 行为型模式行为型模式主要用来封装变化,有以下几种:(1)模版(Template)(2)备忘录(Memento)(3)观察者(Observer)(4)解释器(Interpreter)(5)职责链(Chain of Responsibility)(6)命令(Command)(7)迭代器(Iterator)(8)中介(Mediator)(9)访问者(Visitor)(10)状态(State)(11)策略(Strategy)2. 几个常用模式2.1 单例模式Singleton类定义了一个getInstance()操作,允许客户端访问它的唯一实例。getInstance()是一个静态方法,主要负责创建自己的一个唯一实例。代码如下:public class Singleton private static Singleton instance;private Singleton() /构造方法为“私有”,阻止了外界用new创建本类实例的可能 public static synchronized Singleton getInstance() /创建单例if(instance = null)instance = new Singleton();return instance;其它方法();【例1】 一般对于门面类,需要用单例模式创建它的实例,即在系统中门面类实例只能有一个。对于生成订单的如下类图:为门面接口和门面类命名后的类图为:关于门面类“DAOServiceImple”的代码如下:public class DAOServiceImple implements DAOServiceInterfacepublic UserInfoDAOInterface oneUserInfoDAOImple = null;public GoodsInfoDAOInterface oneGoodsInfoDAOImple = null;private static DAOServiceInterface oneDAOServiceInstance = null;private DAOServiceImple() /构造方法public static synchronized DAOServiceInterface getInstance() /单例方法if(oneDAOServiceInstance = null)oneDAOServiceInstance = new DAOServiceImple();return oneDAOServiceInstance;public OrderInfoPO produceOneOrderInfo(String registerUserID, String goodsID) /一揽子包干门面方法oneUserInfoDAOImple = new UserInfoDAOImple();oneGoodsInfoDAOImple = new GoodsInfoDAOImple();UserInfoPO oneUserInfoPO = oneUserInfoDAOImple.selectOneUserInfo(registerUserID);GoodsInfoPO oneGoodsInfoPO = oneGoodsInfoDAOImple.selectOneGoodsInfo(goodsID);OrderInfoPO oneOrderInfoPO = new OrderInfoPO();oneOrderInfoPO.setGoodsName(oneGoodsInfoPO.getGoodsName();oneOrderInfoPO.setGoodsPrice(oneGoodsInfoPO.getGoodsPrice();oneOrderInfoPO.setUserName(oneUserInfoPO.getUserName();return oneOrderInfoPO;客户端类“orderManageBean”调用门面,产生订单,代码如下:public class orderManageBean public OrderInfoPO createOrder()String registerUserID = 1;String goodsID = 1;/以下为用单例模式创建门面类实例:DAOServiceInterface oneDAOServiceBean = DAOServiceImple.getInstance();/以下为产生一个订单:OrderInfoPO oneOrderInfoPO = oneDAOServiceBduceOneOrderInfo(registerUserID, goodsID);return oneOrderInfoPO;2.2 工厂方法2.2.1 如果有这样的上下调用关系:代码如下:服务端:public class ABC public void method() /业务方法客户端:public class XYZ private ABC abc;public void work()abc = new ABC();abc.method(); /调用服务类的业务方法客户端和服务端是紧密耦合的2.2.2 用接口隔离客户端和服务端代码如下:服务端:public interface ABCInterface /接口public void method();public class ABC implements ABCInterface /实现类public void method()客户端:public class XYZ private ABCInterface abc; /这里依赖接口public void work()abc = new ABC(); /但是在创建接口实例时,任然依赖实现类abc.method(); /调用服务类的业务方法客户端和服务端任然是紧密耦合的,要用“工厂类“的“工厂方法”来解决。2.2.3 用工厂方法创建对象实例,客户端依赖工厂方法,不再直接依赖实现类引入工厂类后的类图:代码如下:服务端:public interface ABCInterface /接口public void method(); /业务方法public class ABC implements ABCInterface /实现类public void method()工厂:public class Factory /工厂类public ABC getABC() /工厂方法ABC abc = new ABC();return abc;工厂类的简写形式:public class Factory public ABC getABC()return new ABC();客户端:public class XYZ private ABCInterface abc; /依赖接口private Factory factory;public void work()factory = new Factory();abc = factory.getABC(); /依赖工厂类,用工厂类创建接口的实例abc.method(); /调用服务类的业务方法2.2.4 简单工厂模式考察上述工厂类:public class Factory public ABC getABC()return new ABC();Factory负责创建ABC的实例,ABC类就相当于产品,Factory是工厂,生产产品,这是一个专门生产ABC实例的工厂。如下类图中把ABC和它的接口名改写成Product和ProductInterface:工厂类的代码也改为如下:public class Factory public Product getProduct ()return new Product();这是一个专门生产Product的工厂。思考问题1:如果产品变为多个,怎么办? 即:有多种产品都实现了ProductInterface接口,如何处理?类图变为如下:所有产品和产品接口组成一个“产品群”。代码如下:服务端产品群:(1) 产品接口(如果在接口这个抽象类中需要包含属性数据,则将接口改为抽象类Abstract)public interface ProductInterface public void method();(2) 衣服产品public class Clothes implements ProductInterface public void method()(3) 裤子产品public class Trousers implements ProductInterface public void method()(4) 帽子产品public class Cap implements ProductInterface public void method()工厂类:【方法一】public class Factory public ProductInterface getProduct(String productname)ProductInterface product = null;if(productname = clothes)product = new Clothes();if(productname = trousers)product = new Trousers();if(productname = cap)product = new Cap();return product;要生产哪种产品,需要告诉工厂,即给工厂方法传递一个参数“productname ”,工厂方法变为有参数的方法。工厂类不管是生产一种产品,还是生产几种产品,都只有一个工厂,这种工厂叫“简单工厂”。客户端:public class XYZ private ProductInterface product;private Factory factory;public void work()factory = new Factory();product = factory.getProduct(clothes);product.method();生产产品的名称必须由客户指定,本例是“clothes”【方法二】或者,工厂类中写3各方法,每个方法创建一个产品,这样去掉“产品参数”,客户端代码中也相应修改,代码如下:工厂类:public class Factory public ProductInterface getClothes() /生产衣服return new Clothes();public ProductInterface getTrousers() /生产裤子return new Trousers();public ProductInterface getCap() /生产帽子return new Cap();客户端类直接调用工厂类中的所需要

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论