ImageVerifierCode 换一换
格式:DOCX , 页数:37 ,大小:117.03KB ,
资源ID:4737172      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-4737172.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Android常用的8种设计模式.docx)为本站会员(b****3)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

Android常用的8种设计模式.docx

1、Android常用的8种设计模式An droid常用的8种设计模式一般来说,常用的an droid设计模式有以下8种:适配器、工厂、单例、观 察者、代理、命令、组合、访问者。设计模式之Adapter(适配器模式)定义:将两个不兼容的类纠合在一起使用,属于结构型模式,需要有 Adaptee(被适配者)和Adaptor(适配器)两个身份.为何使用:我们经常碰到要将两个没有关系的类组合在一起使用 ,第一解决方案是:修改各自类的接口,但是如果我们没有源代码,或者,我们不愿意为了 一个应用而修改各自的接口。怎么办:使用 Adapter,在这两种接口之间创建一个混合接口(混血儿).如何使用:实现 Adap

2、ter方式,其实think in Java的类再生一节中已经 提到,有两种方式:组合(composition) 和继承(inheritanee).假设我们要打桩,有两种类:方形桩 圆形桩.public class SquarePegpublic void in sert(Stri ng str) SquarePeg in sert():+str);public class Roun dPegpublic void in sert In tohole(Stri ng msg)Rou ndPeg in sertl ntoHole():+msg); 现在有一个应用,需要既打方形桩,又打圆形桩.那么我

3、们需要将这两个没有 关系的类综合应用.假设RoundPeg我们没有源代码,或源代码我们不想修改,那 么我们使用Adapter来实现这个应用:public class PegAdapter exte nds SquarePegprivate Roun dPeg roun dPeg;public PegAdapter(Ro un dPeg peg)(this.ro un dPeg=peg;)public void in sert(Stri ng str) roun dPeg.i nsertl ntoHole(str);在上面代码中,RoundPeg属于Adaptee,是被适配者.PegAdapte

4、r是Adapter, 将Adaptee(被适配者RoundPeg和Target(目标SquarePeg)进行适配.实际上这 是将组合方法(composition)和继承(inheritanee) 方法综合运用.PegAdapter首先继承SquarePeg,然后使用new的组合生成对象方式,生成 RoundPeg的对象roundPeg,再重载父类insert()方法。从这里,你也了解使用 new生成对象和使用extends继承生成对象的不同,前者无需对原来的类修改,甚 至无需要知道其内部结构和源代码.如果你有些Java使用的经验,已经发现,这种模式经常使用。进一步使用上面的 PegAdapte

5、r是继承了 SquarePeg,如果我们需要两边继 承,即继承SquarePeg又继承RoundPeg因为Java中不允许多继承,但是我们 可以实现(implements)两个接口 (interface)public in terface IRo un dPegpublic void in sertl ntoHole(Stri ng msg);public in terface ISquarePegpublic void in sert(Stri ng str);下面是新的RoundPeg和SquarePeg,除了实现接口这一区别,和上面的没什么 区别。public class SquareP

6、eg impleme nts ISquarePegpublic void in sert(Stri ng str)SquarePeg in sert():+str);public class Roun dPeg impleme nts IRo un dPegpublic void in sert In tohole(Stri ng msg)Rou ndPeg in sertI ntoHole():+msg);下面是新的 PegAdapter,叫做 two-way adapter:public class PegAdapter impleme nts IRo un dPeg,ISquarePeg

7、private Roun dPeg roun dPeg;private SquarePeg squarePeg;/构造方法public PegAdapter(Ro un dPeg peg)this.ro un dPeg=peg;/构造方法public PegAdapter(SquarePeg peg)(this.squarePeg=peg;)public void in sert(Stri ng str) roun dPeg.i nsertl ntoHole(str);还有一种叫Pluggable Adapters, 可以动态的获取几个 adapters中一个。使用 Reflection 技术

8、,可以动态的发现类中的 Public方法。设计模式之Factory (工厂模式)定义:提供创建对象的接口 .为何使用:工厂模式是我们最常用的模式了 ,著名的Jive论坛,就大量使用了工 厂模式,工厂模式在Java程序系统可以说是随处可见。为什么工厂模式是如此常用:因为工厂模式就相当于创建实例对象的 new,我们经常要根据类Class生成实例对象,如 A a=new A()工厂模式也是用来创建实 例对象的,所以以后new时就要多个心眼,是否可以考虑实用工厂模式,虽然这 样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。我们以类Sample为例,如果我们要创建Sample的实

9、例对象:Sample sample=new Sample();可是,实际情况是,通常我们都要在创建sample实例时做点初始化的工作,比如 赋值查询数据库等。首先,我们想到的是,可以使用 Sample的构造函数,这样生成实例就写成Sample sample=new Sample(参数);但是,如果创建sample实例时所做的初始化工作不是象赋值这样简单的事,可 能是很长一段代码,如果也写入构造函数中,那你的代码很难看了(就需要 Refactor 重整)。为什么说代码很难看,初学者可能没有这种感觉,我们分析如下,初始化工作如 果是很长一段代码,说明要做的工作很多,将很多工作装入一个方法中,相当于

10、 将很多鸡蛋放在一个篮子里,是很危险的,这也是有背于Java面向对象的原则, 面向对象的圭寸装(Encapsulation)和分派(Delegation)告诉我们,尽量将长的代 码分派“切割”成每段,将每段再“封装”起来 (减少段和段之间偶合联系性), 这样,就会将风险分散,以后如果需要修改,只要更改每段,不会再发生牵一动 百的事情。在本例中,首先,我们需要将创建实例的工作与使用实例的工作分开,也就是说, 让创建实例所需要的大量初始化工作从 Sample的构造函数中分离出去。这时我们就需要 Factory工厂模式来生成对象了,不能再用上面简单 newSample(参数)。还有,如果Sample

11、有个继承如MySample,按照面向接口编程,我 们需要将Sample抽象成一个接口 现在Sample是接口,有两个子类MySample和 HisSample .我们要实例化他们时,如下:Sample mysample=new MySample();Sample hissample=new HisSample();随着项目的深入,Sample可能还会生出很多儿子出来,那么我们要对这些儿 子一个个实例化,更糟糕的是,可能还要对以前的代码进行修改:加入后来生出儿 子的实例.这在传统程序中是无法避免的但如果你一开始就有意识使用了工厂模式,这些麻烦就没有了 工厂方法你会建立一个专门生产Sample实例

12、的工厂:public class Factorypublic static Sample creator(i nt which)/getClass 产生Sample 一般可使用动态类装载装入类。if (which=1)return new SampleA();else if (which=2) return new SampleB();那么在你的程序中,如果要实例化Sample时.就使用Sample sampleA=Factory.creator(1);这样,在整个就不涉及到 Sample的具体子类,达到封装效果,也就减少错误修改 的机会,这个原理可以用很通俗的话来比喻:就是具体事情做得越多,

13、越容易范错 误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越 笼统,范错误可能性就越少.好象我们从编程序中也能悟出人生道理 ?呵呵.使用工厂方法 要注意几个角色,首先你要定义产品接口,如上面的 Sample,产品接口下有Sample接口的实现类,如SampleA,其次要有一个factory 类,用来 生成产品Sample,如下图,最右边是生产的对象 Sample:进一步稍微复杂一点,就是在工厂类上进行拓展,工厂类也有继承它的实现类 con creteFactory 了。抽象工厂工厂模式中有:工厂方法(Factory Method) 抽象工厂(Abstract Facto

14、ry).这两个模式区别在于需要创建对象的复杂程度上。如果我们创建对象的方法变得 复杂了,如上面工厂方法中是创建一个对象 Sample,如果我们还有新的产品接口 Sample2.这里假设:Sample有两个concrete类SampleA和SamleB,而Sample2也有两个 concrete 类 Sample2A和 SampleB2那么,我们就将上例中Factory变成抽象类,将共同部分封装在抽象类中,不同部分使用子类实现,下面就是将上例中的 Factory拓展成抽象工厂:public abstract class Factorypublic abstract Sample creator。

15、;public abstract Sample2 creator(Stri ng n ame);public class SimpleFactory exte nds Factorypublic Sample creator()return new SampleApublic Sample2 creator(Stri ng n ame)retur n new Sample2Apublic class BombFactory exte nds Factorypublic Sample creator()return new SampleBpublic Sample2 creator(Stri n

16、g n ame)retur n new Sample2B从上面看到两个工厂各自生产出一套 Sample和Sample2,也许你会疑问,为什么我不可以使用两个工厂方法来分别生产 Sample和Sample2?抽象工厂还有另外一个关键要点,是因为 SimpleFactory内,生产Sample和 生产Sample2的方法之间有一定联系,所以才要将这两个方法捆绑在一个类中, 这个工厂类有其本身特征,也许制造过程是统一的,比如:制造工艺比较简单,所以名称叫SimpleFactory 。在实际应用中,工厂方法用得比较多一些,而且是和动态类装入器组合在一起应 用,举例我们以Jive的ForumFactor

17、y为例,这个例子在前面的Singleton模式中我们讨 论过,现在再讨论其工厂模式:public abstract class ForumFactory private static Object initLock = new Object();private static Stri ng className =;private static ForumFactory factory = n ull;public static ForumFactory get In sta nce(Authorizatio n authorizati on) /If no valid authorizatio

18、n passed in, return null.if (authorizati on = nu II) return nu II;/以下使用了 Singleton 单态模式if (factory = n ull) synchroni zed(i nitLock) if (factory = n ull) try /动态转载类Class c = Class.forName(className); factory = (ForumFactory)c .newln sta nce();catch (Excepti on e) return nu II;/Now,返回proxy.用来限制授权对for

19、um的访问 return new ForumFactoryProxy(authorizatio n, factory,factory.getPermissio ns(authorizatio n);/真正创建forum的方法由继承forumfactory 的子类去完成.public abstract Forum createForum(Stri ng n ame, Stri ng descripti on) throws Un authorizedExcepti on, ForumAlreadyExistsExceptio n;因为现在的Jive是通过数据库系统存放论坛帖子等内容数据,如果希望

20、更改为 通过文件系统实现,这个工厂方法ForumFactory就提供了提供动态接口 :private static Stri ng className =;你可以使用自己开发的创建forum的方法代替在上面的一段代码中一共用了三种模式,除了工厂模式外,还有Singleton 单态模式,以及proxy模式,proxy模式主要用来授权用户对forum的访问,因为访问 forum有两种人:一个是注册用户一个是游客guest,那么那么相应的权限就不 一样,而且这个权限是贯穿整个系统的,因此建立一个proxy,类似网关的概念, 可以很好的达到这个效果.看看 Java 宠物店中的 CatalogDAOFa

21、ctory:public class CatalogDAOFactory /*本方法制定一个特别的子类来实现 DAOS式。*具体子类定义是在J2EE的部署描述器中。*/public static CatalogDAO getDAO() throws CatalogDAOSysException CatalogDAO catDao = null;try InitialContext ic = new InitialContext();/ 动态装入 CATALOG_DAO_CLASS/可以定义自己的CATALOG DAO CL,SS而在无需变更太多代码/的前提下,完成系统的巨大变更Stri ng

22、className =(Stri ng) ic.lookup(JNDINames.CATALOG_DAO_CLASS);catDao = (CatalogDAO) Class.forName(className). newln sta nce(); catch (Nam in gExcepti on ne) throw new CatalogDAOSysException(CatalogDAOFactory.getDAO: Namin gExcepti on whilegetting DAO type : n + ne.getMessage(); catch (Excepti on se) t

23、hrow new CatalogDAOSysException(CatalogDAOFactory.getDAO: Excepti on while gett ing DAO type : n + se.getMessage();return catDao;CatalogDAOFactory是典型的工厂方法,catDao是通过动态类装入器className 获得CatalogDAOFactory具体实现子类,这个实现子类在 Java宠物店是用来操 作catalog数据库,用户可以根据数据库的类型不同,定制自己的具体实现子类, 将自己的子类名给与 CATALOG_DAO_CLAS量就可以。由此可

24、见,工厂方法确实为系统结构提供了非常灵活强大的动态扩展机制, 只要 我们更换一下具体的工厂方法,系统其他地方无需一点变换,就有可能将系统功 能进行改头换面的变化。设计模式之Singleton(单例模式)定义:Singleton 模式主要作用是保证在Java应用程序中,一个类Class只有一 个实例存在。在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。还有,singleton能够被状态化;这样,多个单态类在一起就可以作为一个 状态仓库一样向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能 synchronize的安全自动加1,如果你要

25、把这个数字永久保存到数据库,你可以在不修改单态接口的情况下方便的 做到。另外方面,Singleton也能够被无状态化。提供工具性质的功能,Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于 可以节省内存,因为它限制了实例的个数,有利于 Java垃圾回收(garbagecollecti on )。我们常常看到工厂模式中类装入器(class loader)中也用Singleton模式实现的, 因为被装入的类实际也属于资源。如何使用?一般Singleton模式通常有几种形式public class Sin glet on private Si nglet on()

26、/在自己内部定义自己一个实例,是不是很奇怪?/注意这是private 只供内部调用private static Sin glet on in sta nee = new Sin gleto n();/这里提供了一个供外部访问本 class的静态方法,可以直接访问public static Sin glet on get In sta nce() return in sta nee;第二种形式:public class Sin glet on private static Si ngleto n in sta nee = n ull;public static synchroni zed Sin

27、 glet on get In sta nce() /这个方法比上面有所改进,不用每次都进行生成对象,只是第一次/使用时生成实例,提高了效率! if (in sta nce=n ull)in sta nee = newSin glet on(); retur n in sta nee; 使用Singleton.getlnstance() 可以访问单态类。上面第二中形式是lazy initialization ,也就是说第一次调用时初始Singleton,以后就不用再生成了。注意至U lazy initialization 形式中的 synchronized,这个 synchronized 很重

28、要,如果没有 synchroni zed,那么使用 get In sta nce() 是有可能得到多个Singleton 实例。关于 lazy initialization 的 Singleton 有很多涉及double-checked locki ng (DCL) 的讨论,有兴趣者进一步研究。一般认为第一种形式要更加安全些。使用Singleton注意事项:有时在某些情况下,使用 Singleton并不能达到Singleton的目的,如有多个 Singleton对象同时被不同的类装入器装载; 在EJB这样的分布式系统中使用也 要注意这种情况,因为EJB是跨服务器,跨JVM的。我们以SUN公司的

29、宠物店源码(Pet Store在Pet Store 中ServiceLocator 有两种,一个是 EJB目录下;一个是 WEE目录 下,我们检查这两个ServiceLocator会发现内容差不多,都是提供 EJB的查询 定位服务,可是为什么要分开呢?仔细研究对这两种 ServiceLocator才发现区别:在 WEB的 ServiceLocator 的采取 Singleton 模式,ServiceLocator 属于 资源定位,理所当然应该使用 Singleton模式。但是在EJB中,Singleton模式 已经失去作用,所以ServiceLocator才分成两种,一种面向 WEB服务的,一

30、种 是面向EJB服务的。Singleton模式看起来简单,使用方法也很方便,但是真正用好,是非常不容易, 需要对Java的类 线程 内存等概念有相当的了解。进一步深入可参考:设计模式之Observer (观察者模式)Java深入到一定程度,就不可避免的碰到设计模式(design pattern) 这一概念, 了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式 在java的中型系统中应用广泛,遵循一定的编程模式,才能使自己的代码便于理 解,易于交流,Observer(观察者)模式是比较常用的一个模式,尤其在界面设计中 应用广泛,而本站所关注的是Java在电子商务系统中应用

31、,因此想从电子商务实 例中分析Observer的应用.虽然网上商店形式多样,每个站点有自己的特色,但也有其一般的共性,单就商 品的变化,以便及时通知订户这一点,是很多网上商店共有的模式,这一模式类 似 Observer patern.具体的说,如果网上商店中商品在名称价格等方面有变化,如果系统能自动通知 会员,将是网上商店区别传统商店的一大特色.这就需要在商品product中加入 Observer这样角色,以便product细节发生变化时Observer能自动观察到这种 变化,并能进行及时的update或notify 动作.Java的API还为为我们提供现成的 Observer接口我们必须extends1.提供 Add/Delete observer 的方法;2.提供通知(notisfy) 所有observer的方法;/产品类可供Jsp直接使用UseBean调用该

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2