- 博客(204)
- 资源 (11)
- 收藏
- 关注
原创 结构型设计模式(2):桥接模式
动机有些时候一个抽象应该有不同的实现,比如,保存数据时有两种方式,一种是文件方式,一种是数据库方式,通常的做法是继承保存数据的类,然后实现不同的保存方式。这样做的问题就是难于修改和扩展保存方式,运行时无法切换保存方式。定义桥接模式是软件设计模式中最复杂的模式之一,它将事物的抽象部分与它的实现部分分离,使它们都可以独立地变化。如“圆形”、“三角形”归于抽象的“形状”之
2013-04-17 16:14:28
1138
原创 结构型设计模式(1):适配器模式
定义适配器模式(英语:adapter pattern)有时候也称包装样式或者包装。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类工作在一起。有两类适配器模式:1. 对象适配器模式 - 对象适配器通过关联满足用户期待接口,还降低了代码间的不良耦合。在工作中推荐使用“对象适配”。2. 类适配器模式 - 这种适配器模式下,适配器继承自已实现的类
2013-04-17 16:13:10
1014
原创 创建型设计模式(7):对象池模式
定义一个对象池是一组已经初始化过且可以使用的对象的集合,池的用户可以从池子中取得对象,对其进行操作处理,并在不需要时归还给池子而非销毁它。若初始化、实例化的代价高,且有需求需要经常实例化,但每次实例化的数量较少的情况下,使用对象池可以获得显著的效能提升。从池子中取得对象的时间是可预测的,但新建一个实例所需的时间是不确定。实现1. Reusable -
2013-04-17 16:11:28
2879
原创 创建型设计模式(6):原型模式
定义原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。实现1. Client - 创建一个新的对象,然后通过cl
2013-04-16 14:25:04
892
原创 创建型设计模式(5):建造者模式
定义又叫生成器模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。当创建复杂对象的算法应该独立于该对象的组成部分时,而且构造过程必须允许被构造的对象有不同的表示时。我们可以考虑使用建造者模式。实现1. Builder为创建一个Product对象的各个部件指定抽象接口。通常包含创建产品和返回产
2013-04-16 14:23:28
920
原创 创建型设计模式(4):抽象工厂模式
定义抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。“工厂”是创建产品(对象)的地
2013-04-16 14:19:31
804
原创 创建型设计模式(3):工厂方法模式
动机创建一个对象往往需要复杂的过程,所以不适合包含在一个复合工厂中,当有新的产品时,需要修改这个复合的工厂,不利于扩展。而且,有些对象的创建可以需要用到复合工厂访问不到的信息,所以,定义一个工厂接口,通过实现这个接口来决定实例化那个产品,这就是工厂方法模式,让类的实例化推迟到子类中进行。目的1. 定义一个接口,让子类决定实例化哪个产品。2. 通过通用接口创建对象
2013-04-15 14:20:38
904
原创 创建型设计模式(2):简单工厂模式
动机简单工厂模式是抽象工厂和工厂方法的基础和初步实现。目的1. 不向客户透露对象实例化的细节。2. 通过通用接口创建对象。实现实现非常简单:1. Client需要Product时,不使用new来创建,而是提供 Product 描述给Factory,让 Factory 提供一个新的 Product 。2. Factory实例化一个Product
2013-04-15 11:31:26
940
原创 创建型设计模式(1):单例模式
动机有时候只有一个类的实例是很重要的。比如,一个系统应该只有一个窗口管理实例。单例模式是最简单设计模式:类负责实例化自己,确保只有一个实例,并且提供一个访问这个实例的入口。目的1. 确保只有一个实例被创建。2. 提供访问这个实例的入口。实现使用final确保被创建一次,private的构造函数确保不被实例化。public的getInsta
2013-04-15 10:46:46
1061
原创 设计模式原则(6):迪米特原则
迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。英文简写为: LoD.不和陌生人说话,就是说只和朋友说话,那么什么是朋友呢?1. 类中的函数。2. 类中函数的参数。3. 函数中实例化的对象。4. 类的成员变量。5. 类知道的全
2013-04-12 14:08:06
1087
原创 设计模式原则(5):接口隔离原则
定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。就是说,“不应该强迫客户依赖于它们不用的方法。”再通俗点说,不要强迫客户使用它们不用的方法,如果强迫用户使用它们不使用的方法,那么这些客户就会面临由于这些不使用的方法的改变所带来的改变。我们先看一个违反接口隔离的例子:public interface IWorker { public void
2013-04-12 14:07:01
997
原创 android4.2源码下载编译过程
1. 下载安装64位ubuntu11.10。2. 执行sudo passwd root生成root密码,(10.04版需要修改)修改/etc/gdm/gdm.schemas文件中的:bin,root,daemon,adm,lp,sync,shutdown,halt,mail,news,uucp,operator,nobody,nobody4,noaccess,postgres,pv
2013-04-11 21:08:02
3772
1
原创 设计模式原则(4):开闭原则
定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。对扩展开放,意思就是可以对类、模块和函数添加新的功能。对修改关闭,意思就是扩展时最好不要修改原来的类和函数等。下面的例子来自http://www.oodesign.com/open-close-principle.html先是一个不好的例子: class GraphicEditor { publi
2013-04-11 21:01:06
1012
原创 设计模式原则(3):依赖倒置原则
定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。具体到Java中就是“面向接口编程”。例子:违法依赖倒置的情况public class Student { public void read(Book book){ System.out.println("学生开始阅读:"+book.getName()); }}pub
2013-04-11 14:07:10
816
原创 设计模式原则(2):里氏替换原则
里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象。意思就是说,一个地方引用了父类,程序可以正常运行,如果把引用父类的地方换成子类,这个程序也应该能够正常运行。例子:public class Rectangle { int width; int height; public Rectangle(int w, int h){ width = w; heig
2013-04-10 14:39:54
932
原创 设计模式原则(1):单一职责原则
单一职责原则:一个类,只有一个引起它变化的原因。为什么需要单一职责原则?如果一个类有多个原因要去修改它,那么修改一个功能时,可能会让其他功能产生Bug,所以一个类最好只有一个职责。但实际应用中还是比较难实现的,我们只能是尽量符合这个原则。例子:public class Task { public File downloadFile(String path){
2013-04-09 17:53:30
790
原创 类的6大关系:依赖,关联,聚合,组合,泛化,实现
1. 依赖,Dependency,虚线+箭头(箭头指向依赖的对象)从字面上理解就是,一个类中的方法的实现依赖另外一个类,主要描述的就是类与类之间的使用关系。Java中依赖的对象以局域变量、方法的形参,或者对静态方法的形式出现。比如:学生类中有一个读书方法,这个方法需要一个书的对象,可以是方法的局部变量,也可以是参数。2. 关联,Association,实线+箭头(箭头指向关
2013-04-08 16:36:30
1483
原创 java RMI学习
Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。我们先写一个接口和服务端接口的实现,顺便写了一个可序列化的类
2013-03-14 17:13:28
1263
原创 java动态代理的学习
java动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及实现类对象,便能动态地获得代理类。代理类会负责将所有的方法调用分派到实现对象上反射执行(java反射机制学习),在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能。例子:package com.hebaijun;//接口public interface Image { p
2013-03-14 15:15:59
757
原创 java反射机制学习
JAVA反射机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉
2013-03-14 14:30:54
936
原创 堆排序
1)本例使用最小堆,downheap函数把frist位置的值放到合适的位置,让堆还是最小堆。2)刚开始要从最大的有孩子的位置开始执行downheap函数,把整个数组转换为最小堆。3)排序的方法是:取第一个元素(最小的)和最后一个元素交换,然后再转换少了一个元素的堆为最小堆,其实就是downheap交换上来的最后一个元素。4)取到最后就是一个递减的数组了,要递增就使用最大堆。#inc
2013-03-08 16:43:40
956
原创 快速排序
1)先用temp保存第一个位置的值,然后从后面开始找比temp小的值放到第一位。2)然后从前面开始找比temp大的值,放到前面一步找出那个小的值的位置。3)循环上面的步骤,直到完成整个数组。4)把用temp分开的数组分别进行上面的步骤,直到分开的数组只有一个值。#include #define N 9void quicksort(int a[], int first, int
2013-03-08 16:43:09
847
原创 归并排序
基本思路:递归拆分数组,直到只有一个元素,然后进行有序的合并。#include #define N 9void mergesort(int a[], int first, int last, int temp[]);void merge(int a[], int first, int mid, int last, int temp[]);void printarr(int a[]
2013-03-07 15:22:21
712
原创 冒泡排序
基本思路:1)从数组开头开始比较两个数,如果前面大于后面的数,那么交换这两个数。一次比较后,最大的数在N-1项。2)把最后比较的数设置为N-2项,从新开始比较。3)逐步递减,直到第一项。#include #define N 9void bubblesort(int a[], int n);void swap(int *x, int *y);void printarr(in
2013-03-07 15:21:45
685
原创 希尔排序
基本思路:1)将数组按照一个固定的增量分成若干部分,然后按照相隔的增量的元素进行直接插入排序。2)递减增量的值,继续进行插入排序。3)直到值为1时,进行最后一次直接插入排序。#include #define N 9void shellsort(int a[], int n);void swap(int *x, int *y);void printarr(int a[],
2013-03-07 15:21:09
773
原创 Activity的生命周期,状态保存,窗口显示,取得返回结果,安全退出
1. 怎么让activity窗口显示?在xml中的activity项添加:android:theme="@android:style/Theme.Dialog"2. 同一程序中,Activity A启动Activity B时周期方法的调用顺序是?1)A执行onPause。2)B执行onCreate - onStart - onResume3)如果A不可见了执行A的onS
2013-03-07 15:19:49
1426
原创 直接插入排序
基本思路:1. 从a[0]开始,也就是从1个元素开始是有序的,a[1]~a[n-1]是无序的。2. 从a[1]开始并入前面有序的数组,直到n-1。#include #define N 5void insertsort(int a[], int n);void swap(int *x, int *y);void insertsort(int a[], int n){ int
2013-03-06 14:37:46
702
原创 直接选择排序
基本思路:1. 从1开始通过对比找出最小的数的下标。然后把这个下标的值和0交换。2. 循环把值交换到1 2 3 ... n-1。#include #define N 5void selectsort(int a[], int n);void swap(int *x, int *y);void selectsort(int a[], int n){ int i,j; fo
2013-03-06 14:25:57
823
原创 Android中intent传递对象和Bundle的用法
android中的组件间传递的对象一般实现Parcelable接口,当然也可以使用java的Serializable接口,前者是android专门设计的,效率更高,下面我们就来实现一个Parcelabel。1. 创建一个类实现Parcelable接口,具体实现如下:package com.hebaijun.testparcelable;import android.os.Par
2013-03-06 14:14:33
60978
3
原创 Android签名和反编译的学习
1. 先创建一个基本的android程序,不修改任何代码,然后我们导出一个没签名的apk文件。步骤:右键项目 -> android tools -> Export Unsigned Application Package2. 使用keytool工具生成数字证书。这个工具在jdk的bin目录下。keytool -genkey -v -keystore "d:\hellosigne
2013-03-05 16:27:14
1232
原创 王爽《汇编语言》实验16:包含多个功能子程序的中断例程 解答
中断例程:assume cs:codecode segmentstart: mov ax,cs mov ds,ax mov si,offset setscreen mov ax,0 mov es,ax mov di,200h mov cx,offset setscreenend-offset setscreen cld rep movsb mov ax,0 mov
2012-12-25 17:41:36
4495
8
原创 王爽《汇编语言》实验15:安装新的int 9中断例程 解答
assume cs:codestack segment db 128 dup(0)stack endscode segmentstart: mov ax,stack mov ss,ax mov sp,128 mov ax,code mov ds,ax mov ax,0 mov es,ax mov si,offset int9 mov di,204h mov
2012-12-25 17:40:26
1554
原创 王爽《汇编语言》实验14:访问CMOS RAM打印日期和时间 解答
assume cs:codedata segment db '00/00/00 00:00:00','$' db 9,8,7,4,2,0data endscode segmentstart: mov ax,data mov ds,ax mov di,0 mov si,18 ;data中第二组数据 mov cx,6s: mov al,[si] out 70h,al
2012-12-20 23:20:01
3224
3
原创 王爽《汇编语言》实验13:编写、应用中断例程 - 模拟loop 解答
中断例程:assume cs:codecode segmentstart: mov ax,cs mov ds,ax mov si,offset lp mov ax,0 mov es,ax mov di,200h mov cx,offset lpend-offset lp cld rep movsb mov ax,0 mov es,ax mov word pt
2012-12-20 23:19:25
1187
原创 替换android模拟器的Launcher程序
1. 启动模拟器。2. 命令行:adb shell 进入模拟机3. 执行 mount -o remount,rw /system 命令4. mv或者rm你需要替换的程序。5. ctrl+c退出模拟器6. adb push 本地路径 /system/app7. 点击模拟器的Home按钮,就可以启动你自己的launcher了。
2012-12-20 17:52:12
2931
原创 王爽《汇编语言》实验13:编写、应用中断例程 - 打印字符串 解答
中断例程:assume cs:codecode segmentstart: mov ax,cs mov ds,ax mov si,offset prints mov ax,0 mov es,ax mov di,200h mov cx,offset printsend-offset prints cld rep movsb mov ax,0 mov es,ax
2012-12-19 23:03:37
2192
原创 王爽《汇编语言》实验12:编写0号中断的处理程序 解答
assume cs:codecode segmentstart: mov ax,cs mov ds,ax mov si,offset do0 mov ax,0 mov es,ax mov di,200h mov cx,offset do0end-offset do0 cld rep movsb mov word ptr es:[0*4],200h mov word p
2012-12-19 21:39:36
3820
原创 王爽《汇编语言》实验11:编写子程序letterc 解答
assume cs:codesgdatasg segment db "Beginner's All-purpose Symbolic Instruction Code.",0datasg endscodesg segmentbegin: mov ax,datasg mov ds,ax mov si,0 call letterc mov ax,4c00h int 21h
2012-12-18 22:54:10
5787
原创 王爽《汇编语言》课程设计1
运行结果(减少了部分数据量,不影响程序):程序如下:assume cs:code;年份year segment db '1975','1978','1981','1984','1987','1990','1993','1995' year ends;收入income segment dd 16,1356,16000,97479,345980,1183000,375
2012-12-18 17:45:37
4219
5
原创 王爽《汇编语言》实验10:编写子程序dtoc 解答
assume cs:codedata segment ;保存转换后的ASCII db 10 dup(0)data endscode segmentstart: mov ax,12666 mov bx,data mov ds,bx mov si,0 call dtoc mov dh,8 mov dl,3 mov cl,2 call show_str mov a
2012-12-17 14:22:20
6930
1
help & manual 制作中的常见5个问题
2009-01-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人