- 博客(336)
- 资源 (16)
- 收藏
- 关注
原创 Proxy 模式(一)
在 Gof 的书中对Proxy模式的目的给定为:为其它的物件提供一种代理,以控制对这个物件的访问。由这句话所延伸出来的意思是,根据您的目的不同,您的代理物件将负有不同的责任,因为产生多种不同的代理情况。根据不同的代理目的,而有不同的代理情况,在Gof中所举的一个例子是VirtualProxy,当中举一个文档中内嵌图片的例子,假设您的图片是在文档分页的后面,一开始您并不用直接载入图片,而使用
2011-11-25 13:56:55 472
原创 Flyweight 模式
在 Gof 的书中指出,Flyweight的目的在于运用共享技术,使得一些细粒度的物件可以共享。Flyweight在牛津字典中的解释是"boxer of the lightest class"。意思是特轻量级拳击手?其实应该是取"thelightestclass"这部份的解释,一个特轻量级类别,这个类别所产生的物件可以共用在每一个场合(context),并依场合资讯表现物件外观。在
2011-11-25 13:53:42 589
原创 Facade 模式
考虑您要撰写一个WebMail程式,您手上已经有一些已经开发好的元件(Component),像是开发WebMail所需要的SMTP处理类、允许上传附档的FileUpload类,以及Web安全相关的API、其它相关的Package等等。当您拿到一些现成的元件,并打算在您的应用程式中使用它们的话,您不应该直接将这些元件耦合至您的应用程式上,例如:上面的作法会让您的应用程式直接与多个
2011-11-25 13:51:14 427
原创 Decorator 模式
在JavaSwing中的JTextArea元件预设并没有卷轴,因为设计人员认为卷轴的功能并不是一定需要的,而决定让程式人员可以动态选择是否增加卷轴功能,卷轴的功能是由JScrollPane元件提供,如果您要加入一个具有卷轴功能的JTextArea,您可以如下进行设计:JTextArea textArea = new JTextArea();JScrollPane scrollPane =
2011-11-25 13:47:53 471
原创 Composite 模式
如果以绘图为例的话,一个文字是一个绘图元件,一个线段是一个绘图元件,而一个长方形也是一个绘图元件,这些绘图元件可以组成一个图片,如果将这个图片也视作一个绘图元件,则这么递回绘图下去,就可以组合成一个较大的、复杂的图形元件,这样的目的可以使用Composite模式来解决。对于使用者而言,无论是文字、线段或长方形,甚至是组合后的图片元件,它们都拥有一个共同的行为,使用者基本上并不会感觉出它们之
2011-11-25 13:44:14 469
原创 Bridge 模式
在 Gof 的书中指到Bridge模式的目的:“将抽象部份与它的实现部份分离,使它们都可以独立地变化。”这句话写得简短,这边再作进一步的解释,抽象部份指的是行为方面定义,实现方面指的是与特定平台相依的代码实现。一个实际的例子在Gof书中有提到,假设您定义了一个IWindow介面,这个介面只定义一些抽象的绘图行为,而不涉及平台的实作,今天您可以继承这个类来开发适用于X Window的
2011-11-25 13:30:37 468
原创 Adapter 模式 - Class Adapter
Adapter模式的另一种作法是Class Adapter模式,在这个模式下,Adapter直接继承Adaptee(要引进的新类别),以拥有当中的成员及方法,在C++中的话可以这么作:C++中可以多重继承,但在Java中不行,所以在Java中若要采用Class Adapter,必须作点修改,一方面继承Adaptee,一方面实作Target的介面:代码的实现是这样的: publi
2011-11-25 13:26:01 584
原创 Adapter 模式 - Object Adapter
您的电脑是个旧电脑,新的滑鼠都在使用USB接口了,而您的电脑上并没有USB,而只有一个PS2接口,这时您可以使用一个USB转PS2的接头作为转换,这样您的电脑就可以使用新滑鼠了(当然您也可以使用USB扩充卡,意思是相同的)。类似的概念,有时候您想在原来的程式中加入一个外部元件,例如一个类别,但是这个类别与您目前所设计的程式在介面上并不一致,为了让这个外部类与原程式的介面一致,您必须使用一个
2011-11-25 13:16:29 559
原创 Default Adapter 模式
在Java中如果要定义事件处理的方式,必须实作EventListener的子介面,例如实作 WindowListener来定义一些视窗事件的处理方式,WindowListener中定义了七个方法:public interface WindowListener extends EventListener { public void windowOpened(WindowEvent e)
2011-11-25 13:06:28 562
原创 Registry of Singleton 模式
考虑使用 Singleton 模式 时拥有子类别的问题,在Singleton模式中的getInstance()通常是一个静态方法,不能在子类别中重新定义它,关于子类别实例的产生交由getInstance()来进行是最好的选择,例如:public class Singleton { private static Singleton instance = null; priva
2011-11-25 11:31:43 502
原创 Singleton 模式
Singleton的英文意义是独身,也就是只有一个人,应用在物件导向语言上,通常翻译作单例:单一个实例(Instance)。很多时候,您会需要Singleton模式,例如印表机管理,您希望程式中只能有一个Print Spooler,以避免两个列印动作同时输入至印表机中;例如资料库管理,因为建立连接(Connection)物件会耗用资源,您希望程式中只能有一个连接物件,所有其它的程式都透过这
2011-11-25 11:30:26 423
原创 Prototype 模式
您从图书馆的期刊从发现了几篇您感兴趣的文章,由于这是图书馆的书,您不可以直接在书中作记号或写字,所以您将当中您所感兴趣的几个主题影印出来,这下子您就可在影印的文章上画记重点。Prototype模式的作用有些类似上面的描述,您在父类别中定义一个clone()方法,而在子类别中重新定义它,当客户端对于所产生的物件有兴趣并想加以利用,而您又不想破坏原来的物件,您可以产生一个物件的复本给它。
2011-11-25 11:21:32 580
原创 Factory Method 模式
考虑一个状况,您所经营的工厂正在生产一个新的电视机产品,现在有一个问题发生了,您的电视机产品所有的组件都可以自行生产,像是操作面版、电源、摇控装置等等等,但荧幕却必须依赖另一个厂商或子厂商供应,这时您怎么办?您不能将生产进度停下了,相反的您必须确定一些事情,您知道有关于荧幕控制的所有介面,您可以将这些对介面的操作沟通先实现,等到荧幕到了,直接将荧幕与您的半成品组合起来,一个完整的成品即可出
2011-11-25 11:10:48 419
原创 Builder 模式
您想要建立一个迷宫产生程式,迷宫使用二维阵列来定义,0表示道路,1表示墙,2表示宝物,根据所定义的二维迷宫阵列,您想要程式自动产生各种不同材质的迷宫,例如砖墙迷宫,钻石迷宫等等。您可以在程式中定义两个角色,一个是指导迷宫建立的Director角色,一个是按照指导者指示建立迷宫的Builder角色,Director根据定义的迷宫阵列来指导Builder,只要更换Builder,就可以完成不同
2011-11-25 11:05:07 477
原创 Abstract Factory 模式
假设您要制作一个对话方块(Dialog)元件,您希望的是这个对话方块可以有不同的视感(Look-and- feel),最基本的想法是,藉由Setter将不同视感的元件设定给这个对话方块,例如: CustomDialog.javapublic class CustomDialog { private IButton button; private ITextFi
2011-11-25 10:56:40 460
原创 Simple Factory 模式
Simple Factory模式(又称Static Factory模式),一个Simple Factory生产成品,而对客户端隐藏产品产生的细节。实作时定义一个产品介面(interface),并透过特定静态方法来建立成品。假设有一个音乐盒工厂,购买音乐盒的客人不用知道音乐盒是如何制作的,他只要知道如何播放音乐盒就可以了,以 UML 类别图来表示以上的概念:如上图所示的,MusicBox
2011-11-25 10:50:49 533
原创 vim+ctags+taglist 安装使用
1 ctags安装tar zxvf ctags-5.7.tar.gzcd ctags-5.7./configure && make && make install使用$ ctags -R"-R"表示递归创建,也就包括源代码根目录下的所有子目录下的源程序。"tags"文件中包括这些对象的列表:l 用#define定义的宏l 枚举型变量的值l 函数的定义、原
2011-11-24 13:44:11 918
原创 Android SQLite
SQLite特点 1.Android平台中嵌入了一个关系型数据库SQLite,和其他数据库不同的是SQLite存储数据时不区分类型 例如一个字段声明为Integer类型,我们也可以将一个字符串存入,一个字段声明为布尔型,我们也可以存入浮点数. 除非是主键被定义为Integer,这时只能存储64位整数 2.创建数据库的表时可以不指定数据类型,例如: CREATE T
2011-11-18 13:48:17 1611
原创 经典排序算法
1、冒泡排序冒泡排序是非常容易理解和实现,,以从小到大排序举例:设数组长度为N。1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。3.N=N-1,如果N不为0就重复前面二步,否则排序完成。按照定义很容易写出代码://冒泡排序1void Bubb
2011-11-16 09:14:32 777
原创 Android OpenGL ES
1. OpenGL ES 简介Android 3D引擎采用的是OpenGL ES。OpenGL ES是一套为手持和嵌入式系统设计的3D引擎API,由Khronos公司维护。在PC领域,一直有两种标准的3D API进行竞争,OpenGL 和 DirectX。一般主流的游戏和显卡都支持这两种渲染方式,DirectX在Windows平台上有很大的优势,但是OpenGL具有更好的跨平台性。由
2011-11-15 08:54:55 9442
原创 Android 常用方法
1、获取资源: Resources res = getBaseContext().getResources(); Drawable draw=res.getDrawable(R.drawable.icon); 2、获得数组: String[] ary = getResources().getStringArray(R
2011-11-14 10:40:10 876
原创 android intent 大全
android 中intent是经常要用到的。不管是页面牵转,还是传递数据,或是调用外部程序,系统功能都要用到intent。★intent大全:1.从google搜索内容Intent intent = new Intent();intent.setAction(Intent.ACTION_WEB_SEARCH);intent.putExtra(SearchManager.QUE
2011-11-14 10:22:58 874
原创 Android推送通知指南
在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相对比较麻烦,最近利用几天的时间对Android的推送通知服务进行初步的研究。在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务,起初我就
2011-11-11 11:19:12 750
原创 android 实现即时通知
APNS ( Android Push Notification Service) 是一种在Android 系统上实现推送的一套服务.通过http接口,向APNS服务器发送一个URL请求后,消息即会推送给指定的设备.使用1)到官方主页申请免费API, 下载 apns_beta_20110831.jar 2) 将apns_beta_20110831.jar添加到工程.
2011-11-10 16:44:46 1126
原创 Android 详解Activity
一、Activity 简介 在android开发中Activity非常重要,在一个应用中,每一个显示的屏幕都是一个Activity。所以学习android,必须要对Activity有一定的了解。 activity类处于android.app包中,继承体系如下: 1。java.lang.Object 2。android.content.Context 3。android
2011-11-09 17:07:15 707
原创 Android 使用权限
Android定义了一种权限方案来保护设备上的资源和功能。例如,在默认情况下,应用程序无法访问联系人列表、拨打电话等。下面就以拨打电话为例介绍一下系统对权限的要求。一般在我们的应用中,如果要用到拨打电话的功能,我们会这样编码: Uri uri = Uri.parse("tel:12345678"); Intent intent = new Intent(Intent.ACT
2011-11-07 18:40:37 1205
原创 Android 线程消息循环
我们知道,Android应用程序是通过消息来驱动的,即在应用程序的主线程(UI线程)中有一个消息循环,负责处理消息队列中的消息。我们也知道,Android应用程序是支持多线程的,即可以创建子线程来执行一些计算型的任务,那么,这些子线程能不能像应用程序的主线程一样具有消息循环呢?这些子线程又能不能往应用程序的主线程中发送消息呢?本文将分析Android应用程序线程消息处理模型,为读者解答这两个问题
2011-11-05 06:18:58 5074
原创 Android 用户界面解析
用户界面 在一个Android应用程序里,用户接口是一系列的View和ViewGroup对象组合而成。Android有很多种View和ViewGroup对象,他们都继承自View基类。 View对象是Android平台用户接口的基本对象。这些view类作为与用户交互的widgets小部件的父类,像文本框和按钮。ViewGroup作为提供各种布局结构的layouts的父类,例如linea
2011-11-01 16:24:48 4996 1
原创 java 抽象类 接口
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。 abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于 abstract class和interface的选择显得比较随意。其实,两者
2011-10-31 18:39:56 608
原创 C++ Vector
标准库Vector类型使用需要的头文件:#include Vector:Vector 是一个类模板。不是一种数据类型。 Vector是一种数据类型。一、 定义和初始化Vector v1; //默认构造函数v1为空Vector v2(v1);//v2是v1的一个副本Vector v3(n,i);//v3包含n个值为i的元素Vector v4(n); //v4含有n个值
2011-10-31 14:41:26 721
原创 Android 开发常见问题
1、 Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。2、sim卡的EF 文件有何作用sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本身可以有自
2011-10-30 09:35:58 690
原创 Content Providers
内容提供器用来存放和获取数据并使这些数据可以被所有的应用程序访问。它们是应用程序之间共享数据的唯一方法;不存在所有Android软件包都能访问的公共储存区域。Android为常见数据类型(音频,视频,图像,个人联系人信息,等等)装载了很多内容提供器。你可以看到在android.provider包里列举了一些。你还能查询这些提供器包含了什么数据(尽管,对某些提供器,你必须获取合适的权限来读取数据
2011-10-28 08:55:42 733
原创 Linux 音频编程接口
(1)、OSS (Open Sound System)是 Unix 平台上一个统一的音频接口, 比较老的,提供下面等几个设备 /dev/sndstat /dev/audio /dev/dsp /dev/mixer用户可以直接使用Unix的命令来放音和录音,命令cat /dev/dsp >filename可用来录音
2011-10-26 13:43:13 1899
原创 Android LOG机制的实现
Android提供了用户级轻量的LOG机制,它的实现贯穿了Java,JNI,本地c/c++实现以及LINUX内核驱动等Android的各个层次,而且足够简单清晰,是一个相当不错的解读案例。本系列文章针对LOG机制的内部实现机理进行解读,解读LOG机制的实现架构。LOG的运行环境 下图是Android官方网站上给出的Android的Debug环境。 Android的LOG机制当
2011-10-25 17:59:19 7381
原创 pthread_cond_timedwait pthread_cond_wait
1 pthread_cond_timedwait行为和pthread_cond_wait一样,在返回的时候都要再次lock mutex.2 pthread_cond_timedwait所谓的如果没有等到条件变量,超时就返回,并不确切。如果pthread_cond_timedwait超时到了,但是这个时候不能lock临界区,pthread_cond_timedwait并不会立即返回,但是在p
2011-10-25 09:36:19 4488
原创 Android 自动升级
1.检测当前版本的信息AndroidManifest.xml-->manifest-->android:versionName。2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。3.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。获取
2011-10-22 16:45:27 832
原创 SurfaceFlinger中的Layer,LayerDim,LayerBlur,LayerBuffer
应用程序中不同类型的Surface,在FrameWorks本地层的SurfaceFlinger中,分别对应着不同的Layer类,本文主要是讨论这几种Layer的实现和差异。创建Layer默认地,创建普通的窗口Surface,在SurfaceFlinger中会创建Layer类,如果想创建LayerDim或LayerBlur,应用程序需要在绑定View之前设置一下窗口的标志位:创建
2011-10-19 17:34:37 1277
原创 SurfaceFlinger工作线程
SurfaceFlinger继承了Thread类,自然也继承了Thread类的threadLoop方法,SurfaceFlinger工作线程的主代码都在threadLoop()方法中。工作线程启动后,基类Thread会循环地调用threadLoop方法,SurfaceFlinger的threadLoop()主要是要完成系统中各个Layer(Surface)进行混合(compose),然后不停地把一
2011-10-19 17:30:00 988
原创 SurfaceFlinger中的SharedClient
SurfaceFlinger在系统启动阶段作为系统服务被加载。应用程序中的每个窗口,对应本地代码中的Surface,而Surface又对应于SurfaceFlinger中的各个Layer,SurfaceFlinger的主要作用是为这些Layer申请内存,根据应用程序的请求管理这些Layer显示、隐藏、重画等操作,最终由SurfaceFlinger把所有的Layer组合到一起,显示到显示器上。当一个
2011-10-19 17:26:00 1190
原创 Android AudioFlinger
AudioFlinger是Android音频系统的两大服务之一,另一个服务是AudioPolicyService,这两大服务都在系统启动时有MediaSever加载,加载的代码位于:frameworks/base/media/mediaserver/main_mediaserver.cpp。本文主要介绍AudioFlinger,AudioFlinger向下访问AudioHardware,实现输
2011-10-19 17:19:21 12370 1
OpenGL编程指南(第七版)
2012-01-04
testmusic.pcm AudioTrack使用测试文件
2011-10-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人