當前位置:首頁 » 定製禮盒 » 定製子類

定製子類

發布時間: 2022-11-15 17:30:12

1、j2ee中幾種常用的設計模式怎麼用

建議你買一本叫 《設計模式之禪》的書 裡面講得比較通俗

2、Java 定製的Jpanel 子類是用來做什麼的

JPanel是面板,JFrame是窗口,JLabel是文字標簽,
文字標簽裝在面板里,面板裝在窗口裡,輸出來的就是我們見到的對話框了。

3、軟體設計模式之模板模式的好處是什麼?

模板方法模式(Template Method Pattern),定義一個操作中的演算法骨架,而將一些實現步驟延遲到子類當中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。
模板方法模式是比較簡單的一種設計模式,但是它卻是代碼復用的一項基本的技術,在類庫中尤其重要,它遵循「抽象類應當擁有盡可能多的行為,應當擁有盡可能少的數據」的重構原則。作為模板的方法要定義在父類中,在方法的定義中使用到抽象方法,而只看父類的抽象方法是根本不知道怎樣處理的,實際做具體處理的是子類,在子類中實現具體功能,因此不同的子類執行將會得出不同的實現結果,但是處理流程還是按照父類定製的方式。這就是模板方法的要義所在,制定演算法骨架,讓子類具體實現。

推薦你一本設計模式方面的優秀書籍:鄭阿奇 主編的《軟體秘笈-設計模式那點事》。裡面講解很到位,實例通俗易懂,看了收獲很大!

祝你早日學會設計模式!

4、自定義的uicollectionviewlayout怎麼定製footer

UICollectionView是iOS6引入的控制項,而UIDynamicAnimator是iOS7上新添加的框架。
本文主要涵蓋3部分:
一是簡單概括UICollectionView的使用;二是自定義一個UICollectionViewLayout來實現不同的Collection布局;

三是在自定義UICollectionViewLayout的基礎上添加UIDynamicAnimator。
1. 使用UICollectionView
因為UICollectionView在iOS6上就引入了,所以這里就簡單的介紹下。在正式使用前,我們有必要對UICollectionView認識一下。

UICollectionView和UITableView有點類似,但又有不一樣。從上圖可以看出,組建一個UICollectionView不僅需要內容相關的對象,
如DataSource和Delegate,還需要布局相關的對象即UICollectionViewLayout。
Data Source:提供相關的data和view
Delegate: 實現點擊/插入/刪除等操作時需要的方法
Layout:提供布局view(如cell,supplementary,decoration view)需要的相關數據
熟悉UITableView的,對DataSource和Delegate應該比較親切,他們的作用和在TableView里的完全一樣。而UICollectionViewLayout是一個新的類,
他的作用就是控制所有view的顯示。Layout會為每個view(如果需要顯示),提供一個LayoutAttribute,通過LayoutAttribute,CollectionView就
知道如何去組織了。注意LayoutAttribute除了可以提供frame信息,還可以添加偽3D的信息和UIKit的動態信息。通過抽離布局信息,這樣很好的維護了
模塊間的獨立性,而且也方便我們對layout進行重定義。理解這個框架圖有助於理解CollectionView的渲染過程以及自定義Layout。
下面我們認識下COllectionView:

上圖是UICollectionViewFlowLayout的一個布局,我們以此進行介紹:
Cell:如上每一個單元格就是一個cell,和UITableViewCell一樣,你可以進行自定義,添加image,label等等
Supplementary view:圖中的Header和Footer就是Supplementary view,
Decoration view: 圖中沒有顯示,不過顧名思義可以理解為修飾的view,如背景之類。它和Supplemetary的區別在於,後者往往是和數據相關聯的。
知道了這些,我們就可以實現一個簡單的CollectionView了。
在storeboard里新建一個viewController,並在view上添加一個UICollectionView,collectionview的delegate和datasource都在SB里連接好。
為了簡單,我們直接使用UICollectionViewFlowLayout:

紅色和綠色的label所在處就代表header和footer,他們都是用supplementary來表示,中間的Imageview所在處代表一個cell。
代碼里三者都進行了簡單的繼承自定義,注意給他們三者設置一個identifier,這樣利於重用。
然後在代碼里實現dataSource方法:

- (NSInteger):(UICollectionView *)collectionView { return 2; } - (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section; { return 20; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { ZJCell *cell = [collectionView :@"ZJCell" forIndexPath:indexPath]; NSString *imgName = [NSString stringWithFormat:@"%d.JPG",indexPath.row]; cell.imageView.image = [UIImage imageNamed:imgName]; return cell; } - (UICollectionReusableView*)collectionView:(UICollectionView *)collectionView :(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { ZJSupplementaryView *supplementaryView = nil; NSString *text = nil; if ([kind isEqualToString:]) { supplementaryView = [collectionView :kind withReuseIdentifier:@"CLHeader" forIndexPath:indexPath]; text = [NSString stringWithFormat:@"Header %d",indexPath.section]; supplementaryView.backgroundColor = [UIColor darkGrayColor]; } else { supplementaryView = [collectionView :kind withReuseIdentifier:@"CLFooter" forIndexPath:indexPath];; text = [NSString stringWithFormat:@"Footer %d",indexPath.section]; supplementaryView.backgroundColor = [UIColor lightGrayColor]; } supplementaryView.label.text = text; return supplementaryView; }

這樣一個最簡單的flow式的照片顯示就實現了,成品如下:

2 自定義Layout
Layout類中,有3個方法是必定會被依次調用:
prepareLayout: 准備所有view的layoutAttribute信息
collectionViewContentSize: 計算contentsize,顯然這一步得在prepare之後進行
: 返回在可見區域的view的layoutAttribute信息
此外,還有其他方法可能會被調用:

- ( *):(NSIndexPath *)indexPath { } - ( *):(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { } - ( *):(NSString *)decorationViewKind atIndexPath:(NSIndexPath *)indexPath { } - (BOOL):(CGRect)newBounds { }

比如,如果沒有Decoration view,那麼相應的方法就可以不實現。
接下來我們要實現一個自定義的layout。官方文檔CollectionViewPGforIOS中指出了需要自定義layout的情形:

簡單的說,就是現有的類(UICollectionViewLayout和UICollectionViewFlowLayout)不能滿足需要的情況下需要自定義。
下面我們來實現CollectionViewPGforIOS中的自定義的例子,如圖:

文檔中,已經詳細的闡述了每一步需要做的事情,這里就不多說了。但是因為文檔中對於實現細節沒有涉及,因此這里主要還是圍繞之前提到的3個方法來進行說明。
這里假設你已經看過文檔,並且知道自定義所需要的步驟。還需要聲明的是,文檔中給出的圖以及下文的文字說明都是豎狀排列的,但是由於疏忽,實現的時候變成了橫向。希望因此不會給你造成混淆。
前提還需要做的准備:
1 定義Layout的子類

@interface ZJCustomLayout : UICollectionViewLayout @property (nonatomic, weak) id customDataSource; @end

@interfaceZJCustomLayout ()
{

NSInteger numberOfColumn;//here in this Sample Column equals the section

}

@property (nonatomic) NSDictionary *layoutInformation;//存儲所有view的layoutAttribute
@property (nonatomic) CGFloat maxWidth;//用於計算contentSize
@property (nonatomic) UIEdgeInsets insets;
@end

protocol是用來獲取一些數據,稍後定義。在擴展中定義一些屬性,用於存儲信息。
2 定義LayoutAttribute的子類

@interface : @property (nonatomic) NSArray *children; @end @implementation - (BOOL)isEqual:(id)object { *attribute = ( *)object; if ([self.children isEqualToArray:attribute.children]) { return [super isEqual:object]; } return NO; } @end

就是每一個cell的屬性,children表示當前cell所擁有的子cell。而isEqual是子類必須要重載的。
我們首先看一下,cell是如何布局的:

紅色3是cell的最終位置。布局的時候,先把最後一列的cell依次加上,如紅色1所示。
然後排前一列即第二列,先依次加上,這時最後的綠色cell有子cell,就把第三列的綠色cell位置更新。
最後排第一列,因為第一個cell有3個子cell,所以要空兩個開始排列。這時最後一個綠色cell有子cell這時就又要調整第二列以及第三列的綠色cell。
這里cell調整的思路很清晰:先依次從上到下排列,然後再根據是否有子cell進行更新。
在實際實現中,我根據這樣的思路,設計了類似的演算法:
從後向前布局每一列,每一列的cell依次從上向下布局;
除最後一列的cell開始布局時,先查看當前列前一行的cell是否有子cell:有的話調整自己的位置
如果當前cell的位置進行了調整,那麼調整自己子cell的位置
很顯然,在初始化每個cell的layoutAttribute的時候,我們需要先知道每一個cell的子cell的情況,於是我們設計一個協議:

@protocol ZJCustomLayoutProtocol - (NSArray *)childrenAtIndexPath:(NSIndexPath *)indexPath; @end

這個和CollectionView的dataSource,delegate一樣,由viewController來提供。

5、iOS UICollectionView橫向滑動並且橫向載入數據

最近在做標簽選擇頁的時候碰到這樣一個需求,一頁顯示8個標簽,超過時顯示多頁的效果。一開始本人信心滿滿的使用UICollectionView,並調整了 scrollDirection 為  ,發現基本滿足需求。但是在標簽個數為5個時候的出現了問題,右半邊出現了空白。因為 UICollectionView 調整為橫向滾動後,數據的填充的方式就改變了。如下圖:

                                          

 可以發現數據的填充方式變為了從上往下,顯然與我們需要的從左往右的方式不符。

   為了解決這個問題,我們需要自定義UICollectionViewFlowLayout。

  

 創建子類繼承自 UICollectionViewFlowLayout 。

  

 主要通過下面這4個方法,對自定義 UICollectionViewFlowLayout 進行定製操作。

  

 在 - (void)prepareLayout; 方法中設置一行要顯示的個數,及一頁要顯示的行數,本文以4*2為例:

  

 在 - (CGSize)collectionViewContentSize; 方法中對滾動范圍進行計算:

  

 在 - (NSArray *):(CGRect)rect; 方法中返回我們自定義的布局信息:

  

 在 - ( *):(NSIndexPath*)indexPath; 方法中對計算得到偏移後將要替換的 item 對象進行 indexPath 交換

  

 計算x,y方向的偏移

  

 得到將要替換的 item 

  

 完成了將數據的填充方式變為從左往右。得到如下圖的效果:

   

                                          

 

  

 Demo

   鏈接:  https://pan.網路.com/s/1qgBrtFV53S8iTSMLo-N1iA  提取碼: rbve

6、電腦里常用的的英語有那些(漢語意思)?

第一部分、計算機演算法常用術語中英對照
Data Structures 基本數據結構
Dictionaries 字典
Priority Queues 堆
Graph Data Structures 圖
Set Data Structures 集合
Kd-Trees 線段樹
Numerical Problems 數值問題
Solving Linear Equations 線性方程組
Bandwidth Rection 帶寬壓縮
Matrix Multiplication 矩陣乘法
Determinants and Permanents 行列式
Constrained and Unconstrained Optimization 最值問題
Linear Programming 線性規劃
Random Number Generation 隨機數生成
Factoring and Primality Testing 因子分解/質數判定
Arbitrary Precision Arithmetic 高精度計算
Knapsack Problem 背包問題
Discrete Fourier Transform 離散Fourier變換
Combinatorial Problems 組合問題
Sorting 排序
Searching 查找
Median and Selection 中位數
Generating Permutations 排列生成
Generating Subsets 子集生成
Generating Partitions 劃分生成
Generating Graphs 圖的生成
Calendrical Calculations 日期
Job Scheling 工程安排
Satisfiability 可滿足性
Graph Problems -- polynomial 圖論-多項式演算法
Connected Components 連通分支
Topological Sorting 拓撲排序
Minimum Spanning Tree 最小生成樹
Shortest Path 最短路徑
Transitive Closure and Rection 傳遞閉包
Matching 匹配
Eulerian Cycle / Chinese Postman Euler迴路/中國郵路
Edge and Vertex Connectivity 割邊/割點
Network Flow 網路流
Drawing Graphs Nicely 圖的描繪
Drawing Trees 樹的描繪
Planarity Detection and Embedding 平面性檢測和嵌入
Graph Problems -- hard 圖論-NP問題
Clique 最大團
Independent Set 獨立集
Vertex Cover 點覆蓋
Traveling Salesman Problem 旅行商問題
Hamiltonian Cycle Hamilton迴路
Graph Partition 圖的劃分
Vertex Coloring 點染色
Edge Coloring 邊染色
Graph Isomorphism 同構
Steiner Tree Steiner樹
Feedback Edge/Vertex Set 最大無環子圖
Computational Geometry 計算幾何
Convex Hull 凸包
Triangulation 三角剖分
Voronoi Diagrams Voronoi圖
Nearest Neighbor Search 最近點對查詢
Range Search 范圍查詢
Point Location 位置查詢
Intersection Detection 碰撞測試
Bin Packing 裝箱問題
Medial-Axis Transformation 中軸變換
Polygon Partitioning 多邊形分割
Simplifying Polygons 多邊形化簡
Shape Similarity 相似多邊形
Motion Planning 運動規劃
Maintaining Line Arrangements 平面分割
Minkowski Sum Minkowski和
Set and String Problems 集合與串的問題
Set Cover 集合覆蓋
Set Packing 集合配置
String Matching 模式匹配
Approximate String Matching 模糊匹配
Text Compression 壓縮
Cryptography 密碼
Finite State Machine Minimization 有窮自動機簡化
Longest Common Substring 最長公共子串
Shortest Common Superstring 最短公共父串
DP——Dynamic Programming——動態規劃
recursion —— 遞歸

第二部分、編程詞彙
A2A integration A2A整合
abstract 抽象的
abstract base class (ABC)抽象基類
abstract class 抽象類
abstraction 抽象、抽象物、抽象性
access 存取、訪問
access level訪問級別
access function 訪問函數
account 賬戶
action 動作
activate 激活
active 活動的
actual parameter 實參
adapter 適配器
add-in 插件
address 地址
address space 地址空間
address-of operator 取地址操作符
ADL (argument-dependent lookup)
ADO(ActiveX Data Object)ActiveX數據對象
advanced 高級的
aggregation 聚合、聚集
algorithm 演算法
alias 別名
align 排列、對齊
allocate 分配、配置
allocator分配器、配置器
angle bracket 尖括弧
annotation 註解、評注
API (Application Programming Interface) 應用(程序)編程介面
app domain (application domain)應用域
application 應用、應用程序
application framework 應用程序框架
appearance 外觀
append 附加
architecture 架構、體系結構
archive file 歸檔文件、存檔文件
argument引數(傳給函式的值)。參見parameter
array 數組
arrow operator 箭頭操作符
ASP(Active Server Page)活動伺服器頁面
ASP.NET worker process ASP.NET工作者進程
assembly 裝配件、配件
assembly language 匯編語言
assembly manifest 裝配件清單
assert(ion) 斷言
assign 賦值
assignment 賦值、分配
assignment operator 賦值操作符
associated 相關的、相關聯的
associative container 關聯式容器(對應sequential container)
asynchronous 非同步的
atomic 原子的
atomic operation 原子操作
attribute 特性、屬性
authentication service 驗證服務
authorization 授權
audio 音頻
A.I. 人工智慧
B2B integration B2B整合、B2B集成(business-to-business integration)
background 背景、後台(進程)
backward compatible 向後兼容、向下兼容
backup 備份
backup device備份設備
backup file 備份文件
bandwidth 帶寬
base class 基類
base type 基類型
batch 批處理
BCL (base class library)基類庫
binary 二進制
binary search 二分查找
binary tree 二叉樹
binary function 雙參函數
binary large object二進制大對象
binary operator 二元操作符
binding 綁定
bit 位
bitmap 點陣圖
bitwise 按位...
bitwise 為單元進行復制;位元逐一復制,按位拷
bitwise operation 按位運算
block 塊、區塊、語句塊
bookkeeping 簿記
boolean 布林值(真假值,true或false)
border 邊框
bounds checking 邊界檢查
boxing 裝箱、裝箱轉換
brace (curly brace) 大括弧、花括弧
bracket (square brakcet) 中括弧、方括弧
breakpoint 斷點
browser applications 瀏覽器應用(程序)
browser-accessible application 可經由瀏覽器訪問的應用程序
build 編連(專指編譯和連接
built-in 內建、內置
bus 匯流排
business 業務、商務(看場合)
business Logic 業務邏輯
business rules 業務規則
buttons 按鈕
bug 臭蟲
by/through 通過
byte 位元組(由8 bits組成)
cache 高速緩存
calendar 日歷
call 調用
callback 回調
call-level interface (CLI)調用級介面(CLI)
call operator 調用操作符
candidate key 候選鍵 (for database)
cascading delete 級聯刪除 (for database)
cascading update 級聯更新 (for database)
casting 轉型、造型轉換
catalog 目錄
chain 鏈(function calls)
character 字元
character format 字元格式
character set 字元集
CHECK constraints CHECK約束 (for database)
checkpoint 檢查點 (for database)
check box 復選框
check button 復選按鈕
child class 子類
CIL (common intermediate language)通用中間語言、通用中介語言
class 類
class declaration 類聲明
class definition 類定義
class derivation list 類繼承列表
class factory 類廠
class hierarchy 類層次結構
class library 類庫
class loader 類裝載器
class template 類模板
class template partial specializations 類模板部分特化
class template specializations 類模板特化
classification 分類
clause 子句
client application 客戶端應用程序
client cursor 客戶端游標 (for database)
code page 代碼頁
cleanup 清理、清除
CLI (Common Language Infrastructure) 通用語言基礎設施
client 客戶、客戶端
client area 客戶區
client-server 客戶機/伺服器、客戶端/伺服器
clipboard 剪貼板
clone 克隆
CLS (common language specification) 通用語言規范
code access security 代碼訪問安全
COFF (Common Object File Format) 通用對象文件格式
collection 集合
COM (Component Object Model) 組件對象模型
combo box 組合框
command line 命令行
comment 注釋
commit 提交 (for database)
communication 通訊
compatible 兼容
compile time 編譯期、編譯時
compiler 編譯器
component組件
composite index 復合索引、組合索引 (for database)
composite key 復合鍵、組合鍵 (for database)
composition 復合、組合
concept 概念
concrete具體的
concrete class 具體類
concurrency 並發、並發機制
constraint 約束 (for database)
configuration 配置、組態
connection 連接 (for database)
connection pooling 連接池
console 控制台
constant 常量
construct 構件、成分、概念、構造(for language)
constructor (ctor) 構造函數、構造器
container 容器
containment包容
context 環境、上下文
control 控制項
cookie (不譯)
拷貝
CORBA 通用對象請求中介架構(Common Object Request Broker Architecture)
cover 覆蓋、涵蓋
create/creation 創建、生成
crosstab query 交叉表查詢 (for database)
CRTP (curiously recurring template pattern)
CTS (common type system)通用類型系統
cube 多維數據集 (for database)
cursor 游標
cursor 游標 (for database)
custom 定製、自定義
data 數據
data connection 數據連接 (for database)
Data Control Language (DCL) 數據控制語言(DCL) (for database)
Data Definition Language (DDL) 數據定義語言(DDL) (for database)
data dictionary 數據字典 (for database)
data dictionary view 數據字典視圖 (for database)
data file 數據文件 (for database)
data integrity 數據完整性 (for database)
data manipulation language (DML)數據操作語言(DML) (for database)
data mart 數據集市 (for database)
data pump 數據抽取 (for database)
data scrubbing 數據清理 (for database)
data source 數據源 (for database)
Data source name (DSN) 數據源名稱(DSN) (for database)
data warehouse 數據倉庫 (for database)
dataset 數據集 (for database)
database 資料庫 (for database)
database catalog 資料庫目錄 (for database)
database diagram 數據關系圖 (for database)
database file 資料庫文件 (for database)
database object 資料庫對象 (for database)
database owner 資料庫所有者 (for database)
database project 資料庫工程 (for database)
database role 資料庫角色 (for database)
database schema 資料庫模式、資料庫架構 (for database)
database script 資料庫腳本 (for database)
data-bound 數據綁定 (for database)
data-aware control數據感知控制項 (for database)
data member 數據成員、成員變數
dataset 數據集 (for database)
data source 數據源 (for database)
data structure數據結構
data table 數據表 (for database)
datagram 數據報文
DBMS (database management system)資料庫管理系統 (for database)
DCOM (distributed COM)分布式COM
dead lock 死鎖 (for database)
deallocate 歸還
debug 調試
debugger 調試器
decay 退化
decision support 決策支持
declaration 聲明
declarative referential integrity (DRI)聲明引用完整性(DRI) (for database)
dection 推導
DEFAULT constraint默認約束 (for database)
default database 默認資料庫 (for database)
default instance 默認實例 (for database)
default result set 默認結果集 (for database)
default 預設、默認值
defer 推遲
definition 定義
delegate 委託
delegation 委託
dependent name
deploy 部署
dereference 解引用
dereference operator (提領)運運算元
derived class 派生類
design by contract 契約式設計
design pattern 設計模式
destroy 銷毀
destructor(dtor)析構函數、析構器
device 設備
DHTML (dynamic HyperText Markup Language)動態超文本標記語言
dialog 對話框
digest 摘要
digital 數字的
DIME (Direct Internet Message Encapsulation)直接Internet消息封裝
directive (編譯)指示符
directory 目錄
dirty pages臟頁 (for database)
dirty read 臟讀 (for database)
disassembler 反匯編器
DISCO (Discovery of Web Services)Web Services的查找
disk 盤
dispatch 調度、分派、派發(我喜歡「調度」)
DISPID (Dispatch Identifier)分派標識符
distributed computing 分布式計算
distributed query 分布式查詢 (for database)
DNA (Distributed interNet Application) 分布式網間應用程序
document 文檔
DOM (Document Object Model)文檔對象模型
dot operator (圓)點操作符
driver 驅動(程序)
DTD (document type definition) 文檔類型定義
double-byte character set (DBCS)雙位元組字元集(DBCS)
mp 轉儲
mp file 轉儲文件
dynamic cursor 動態游標 (for database)
dynamic filter 動態篩選 (for database)
dynamic locking 動態鎖定 (for database)
dynamic recovery 動態恢復 (for database)
dynamic snapshot 動態快照 (for database)
dynamic SQL statements 動態SQL語句 (for database)
dynamic assembly 動態裝配件、動態配件
dynamic binding 動態綁定
EAI (enterprise application integration)企業應用程序集成(整合)
EBCO (empty base class optimization) 空基類優化(機制)
e-business 電子商務
EDI (Dlectronic Data Interchange)電子數據交換
efficiency 效率
efficient 高效
end-to-end authentication 端對端身份驗證
end user 最終用戶
engine 引擎
entity 實體
encapsulation 封裝
enclosing class 外圍類別(與巢狀類別 nested class有關)
enum (enumeration) 枚舉
enumerators 枚舉成員、枚舉器
equal 相等
equality 相等性
equality operator 等號操作符
error log 錯誤日誌 (for database)
escape code 轉義碼
escape character 轉義符、轉義字元
exclusive lock 排它鎖 (for database)
explicit transaction 顯式事務 (for database)
evaluate 評估
event 事件
event driven 事件驅動的
event handler 事件處理器
evidence 證據
exception 異常
exception declaration 異常聲明
exception handling 異常處理、異常處理機制
exception-safe 異常安全的
exception specification 異常規范
exit 退出
explicit 顯式
explicit specialization 顯式特化
export 導出
expression 表達式
facility 設施、設備
fat client 胖客戶端
feature 特性、特徵
fetch 提取
field 欄位(java)
field 欄位 (for database)
field length 欄位長度 (for database)
file 文件
filter 篩選 (for database)
finalization 終結
firewall 防火牆
finalizer 終結器
firmware 固件
flag 標記
flash memory 快閃記憶體
flush 刷新
font 字體
foreign key (FK) 外鍵(FK) (for database)
form 窗體
formal parameter 形參
forward declaration 前置聲明
forward-only 只向前的
forward-only cursor 只向前游標 (for database)
fragmentation 碎片 (for database)
framework 框架
full specialization 完全特化
function 函數
function call operator (即operator ()) 函數調用操作符
function object 函數對象
function overloaded resolution函數重載決議
functionality 功能
function template函數模板
functor 仿函數
GAC (global assembly cache) 全局裝配件緩存、全局配件緩存
GC (Garbage collection) 垃圾回收(機制)、垃圾收集(機制)
game 游戲
generate 生成
generic 泛化的、一般化的、通用的
generic algorithm通用演算法
genericity 泛型
getter (相對於 setter)取值函數
global 全局的
global object 全局對象
global scope resolution operator 全局范圍解析操作符
grant 授權 (for database)
granularity 粒度
group 組、群
group box 分組框
GUI 圖形界面
GUID (Globally Unique Identifier) 全球唯一標識符
hand shaking 握手
handle 句柄
handler 處理器
hard-coded 硬編碼的
hard- 截屏圖
hard disk 硬碟
hardware 硬體
hash table 散列表、哈希表
header file頭文件
heap 堆
help file 幫助文件
hierarchy 層次結構、繼承體系
hierarchical data 階層式數據、層次式數據
hook 鉤子
Host (application)宿主(應用程序)
hot key 熱鍵
hyperlink 超鏈接
HTML (HyperText Markup Language) 超文本標記語言
HTTP pipeline HTTP管道
HTTP (HyperText Transfer Protocol) 超文本傳輸協議
icon 圖標
IDE (Integrated Development Environment)集成開發環境
IDL (Interface Definition Language) 介面定義語言
identifier 標識符
idle time 空閑時間
if and only if當且僅當
IL (Intermediate Language) 中間語言、中介語言
image 圖象
IME 輸入法
immediate base 直接基類
immediate derived 直接派生類
immediate updating 即時更新 (for database)
implicit transaction隱式事務 (for database)
incremental update 增量更新 (for database)
index 索引 (for database)
implement 實現
implementation 實現、實現品
implicit 隱式
import 導入
increment operator 增加操作符
infinite loop 無限循環
infinite recursive 無限遞歸
information 信息
infrastructure 基礎設施
inheritance 繼承、繼承機制
inline 內聯
inline expansion 內聯展開
initialization 初始化
initialization list 初始化列表、初始值列表
initialize 初始化
inner join 內聯接 (for database)
in-place active 現場激活
instance 實例
instantiated 具現化、實體化(常應用於template)
instantiation 具現體、具現化實體(常應用於template)
integrate 集成、整合
integrity 完整性、一致性
integrity constraint完整性約束 (for database)
interprocess communication (IPC)進程間通訊(IPC)
interacts 交互
interface 介面
for GUI 界面
interoperability 互操作性、互操作能力
interpreter 解釋器
introspection 自省
invariants 不變性
invoke 調用
isolation level 隔離級別 (for database)
iterate 迭代
iterative 反復的、迭代的
iterator 迭代器
iteration 迭代(迴圈每次輪回稱為一個iteration)
item 項、條款、項目
JIT compilation JIT編譯 即時編譯
key 鍵 (for database)
key column 鍵列 (for database)
laser 激光
late binding 遲綁定
left outer join 左向外聯接 (for database)
level 階、層例
high level 高階、高層
library 庫
lifetime 生命期、壽命
link 連接、鏈接
linkage 連接、鏈接
linker 連接器、鏈接器
literal constant 字面常數
list 列表、表、鏈表
list box 列表框
livelock 活鎖 (for database)
load 裝載、載入
load balancing 負載平衡
loader 裝載器、載入器
local 局部的
local object 局部對象
lock 鎖
log 日誌
login 登錄
login security mode登錄安全模式 (for database)
lookup table 查找表 (for database)
loop 循環
loose coupling 鬆散耦合
lvalue 左值
machine code 機器碼、機器代碼
macro 宏
maintain 維護
managed code 受控代碼、託管代碼
Managed Extensions 受控擴充件、託管擴展
managed object 受控對象、託管對象
mangled name
manifest 清單
manipulator 操縱器(iostream預先定義的一種東西)
many-to-many relationship 多對多關系 (for database)
many-to-one relationship 多對一關系 (for database)
marshal 列集
member 成員
member access operator 成員取用運運算元(有dot和arrow兩種)
member function 成員函數
member initialization list成員初始值列表
memberwise 以member為單元…、members 逐一…
memberwise
memory 內存
memory leak 內存泄漏
menu 菜單
message 消息
message based 基於消息的
message loop 消息環
message queuing消息隊列
metadata 元數據
metaprogramming元編程
method 方法
micro 微
middleware 中間件
middle tier 中間層
modeling 建模
modeling language 建模語言
modifier 修飾字、修飾符
modem 數據機
mole 模塊
most derived class最底層的派生類
mouse 滑鼠
mutable 可變的
mutex 互斥元、互斥體
multidimensional OLAP (MOLAP) 多維OLAP(MOLAP) (for database)
multithreaded server application 多線程伺服器應用程序
multiuser 多用戶
multi-tasking 多任務
multi-thread 多線程
multicast delegate 組播委託、多點委託
named parameter 命名參數
named pipe 命名管道
namespace 名字空間、命名空間
native 原生的、本地的
native code 本地碼、本機碼
Native Image Generator (NGEN)本地映像生成器
nested class 嵌套類
nested query 嵌套查詢 (for database)
nested table 嵌套表 (for database)
network 網路
network card 網卡
nondependent name
object 對象
object based 基於對象的
object file 目標文件
object model 對象模型
object oriented 面向對象的
laser 激光
late binding 遲綁定
left outer join 左向外聯接 (for database)
level 階、層例
high level 高階、高層
library 庫
lifetime 生命期、壽命
link 連接、鏈接
linkage 連接、鏈接
linker 連接器、鏈接器
literal constant 字面常數
list 列表、表、鏈表
list box 列表框
livelock 活鎖 (for database)
load 裝載、載入
load balancing 負載平衡
loader 裝載器、載入器
local 局部的
local object 局部對象
lock 鎖
log 日誌
login 登錄
login security mode登錄安全模式 (for database)
lookup table 查找表 (for database)
loop 循環
loose coupling 鬆散耦合
lvalue 左值
machine code 機器碼、機器代碼
macro 宏
maintain 維護
managed code 受控代碼、託管代碼
Managed Extensions 受控擴充件、託管擴展
managed object 受控對象、託管對象
mangled name
manifest 清單
manipulator 操縱器(iostream預先定義的一種東西)
many-to-many relationship 多對多關系 (for database)
many-to-one relationship 多對一關系 (for database)
marshal 列集
member 成員
member access operator 成員取用運運算元(有dot和arrow兩種)
member function 成員函數
member initialization list成員初始值列表
memberwise 以member為單元…、members 逐一…
memberwise
memory 內存
memory leak 內存泄漏
menu 菜單
message 消息
message based 基於消息的
message loop 消息環
message queuing消息隊列
metadata 元數據
metaprogramming元編程
method 方法
micro 微
middleware 中間件
middle tier 中間層
modeling 建模
modeling language 建模語言
modifier 修飾字、修飾符
modem 數據機
mole 模塊
most derived class最底層的派生類
mouse 滑鼠
mutable 可變的
mutex 互斥元、互斥體
multidimensional OLAP (MOLAP) 多維OLAP(MOLAP) (for database)
multithreaded server application 多線程伺服器應用程序
multiuser 多用戶
multi-tasking 多任務
multi-thread 多線程
multicast delegate 組播委託、多點委託
named parameter 命名參數
named pipe 命名管道
namespace 名字空間、命名空間
native 原生的、本地的
native code 本地碼、本機碼
Native Image Generator (NGEN)

7、在java中,什麼是介面,介面的特點是什麼

Java介面(Interface),是一系列方法的聲明,是一些方法特徵的集合,一個介面只有方法的特徵沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。

一.介面含義:

1.Java介面,Java語言中存在的結構,有特定的語法和結構;2.一個類所具有的方法的特徵集合,是一種邏輯上的抽象。

前者叫做「Java介面」,後者叫做「介面」。

Java介面本身沒有任何實現,因為Java介面不涉及表象,而只描述public行為,所以Java介面比Java抽象類更抽象化。

Java介面的方法只能是抽象的和公開的,Java介面不能有構造器,Java介面可以有public,靜態的和final屬性。

二.為何用介面Java是一種單繼承的語言,若要給已有父類的具體類增加新功能,在OCP原則下,解決是給它的父類加父類,或者給它父類的父類加父類,直到移動到類等級結構的最頂端。這樣一來,對一個具體類的可插入性的設計,就變成了對整個等級結構中所有類的修改。

當有了介面,以上例子中,就不需要維護整個等級結構中的所有類了.

三.介面具胡可插入性:

在一個等級結構中的任何一個類都可以實現一個介面,這個介面會影響到此類的所有子類,但不會影響到此類的任何超類。此類將不得不實現這個介面所規定的方法,而其子類可以從此類自動繼承這些方法,當然也可以選擇置換掉所有的這些方法,或者其中的某一些方法,這時候,這些子類具有了可插入性(並且可以用這個介面類型裝載,傳遞實現了他的所有子類)。

介面提供了關聯以及方法調用上的可插入性,軟體系統的規模越大,生命周期越長,介面使得軟體系統的靈活性和可擴展性,可插入性方面得到保證。

正是有了介面,使得Java單繼承性有了新的擴展的可能(變向地實現多繼承);三.類型等級結構Java介面(以及抽象類)一般用來作為一個類型的等級結構的起點。

如果一個類已經有了一個主要的超類型,那麼通過實現一個介面,這個類可以擁有另一個次要的超類型,這種次要的超類型叫做混合類型。

四.Java介面分類

1、普通介面(含有方法定義)public interface ActionListener{public abstract void actionPerformed(ActionEvent event);}

2、標識介面(無任何方法和屬性定義)標識介面是沒有任何方法和屬性的介面.標識介面不對實現它的類有任何語義上的要求,它僅僅表明實現它的類屬於一個特定的類型。

public interface Serializable{};

3、常量介面是指用Java介面來聲明一些常量,然後由實現這個介面的類使用這些常量。

public interface AppConstants{public static final DATA_SOURCE_NAME="test";public static final USER_NAME="test";public static final PASSWORD="test";}

五.介面的特點

1、Java介面中的成員變數默認都是public,static,final類型的(都可省略),必須被顯示初始化,即介面中的成員變數為常量(大寫,單詞之間用"_"分隔)

2、Java介面中的方法默認都是public,abstract類型的(都可省略),沒有方法體,不能被實例化

3、Java介面中只能包含public,static,final類型的成員變數和public,abstract類型的成員方法

4、介面中沒有構造方法,不能被實例化5、一個介面不能實現(implements)另一個介面,但它可以繼承多個其它的介面

6、Java介面必須通過類來實現它的抽象方法

7、當類實現了某個Java介面時,它必須實現介面中的所有抽象方法,否則這個類必須聲明為抽象類

8、不允許創建介面的實例(實例化),但允許定義介面類型的引用變數,該引用變數引用實現了這個介面的類的實例

9、一個類只能繼承一個直接的父類,但可以實現多個介面,間接的實現了多繼承.

六.Java介面和Java抽象類區別面向對象設計的重點在於抽象。抽象類與介面都位於繼承樹的上層。

相同點:

1、代表系統的抽象層,當一個系統使用一顆繼承樹上的類時,應該盡量把引用變數聲明為繼承樹的上層抽象類型,這樣可以提高兩個系統之間的送耦合

2、都不能被實例化

3、都包含抽象方法,這些抽象方法用於描述系統能提供哪些服務,但不包含方法體不同點:

1、最大的一個區別,就在於Java抽象類可以提供某些方法的部分實現,而Java介面不可以;這大概就是Java抽象類唯一的優點吧,但這個優點非常有用。

可以向抽象類里加入一個新的具體方法,所有的子類都自動得到這個方法;但Java介面里加入一個 新方法,所有實現這個介面的類就無法成功通過編譯,必需手動給每個實現了該介面的類加上該方法的實現;

2、抽象類的實現只能由子類給出,也即該實現只能在抽象類定義的繼承的等級結構中;所以抽象類作為類型定義工具的效能大打折扣。

Java介面,任何一個實現了一個Java介面所規定的方法的類都可以具有這個介面的類型,而一個類可以實現任意多個Java介面,從而這個類就有了多種類型。

以上看出:Java介面是定義混合類型的理想工具,混合類表明一個類不僅僅具有某個主類型的行為,而且具有其他的次要行為。

3、結合1、2點中抽象類和Java介面的各自優勢,具精典的設計模式就出來了:

聲明類型的工作仍然由Java介面承擔,但是同時給出一個Java 抽象類,且實現了這個介面,而其他同屬於這個抽象類型的具體類可以選擇實現這個Java介面,也可以選擇繼承這個抽象類,也就是說在層次結構中,Java 介面在最上面,然後緊跟著抽象類,這下兩個的最大優點都能發揮到極至了。這個模式就是「預設適配模式」。

在Java語言API中用了這種模式,而且全都遵循一定的命名規范:Abstract +介面名。

七.使用介面和抽象類的總體原則:

1、用介面作為系統與外界交互的窗口站在外界使用者(另一個系統)的角度,介面向使用者承諾系統能提供哪些服務,站在系統本身的角度,介面制定系統必須實現哪些服務,介面是系統中最高層次的抽象類型.通過介面交互可以提高兩個系統之間的送耦合系統A通過系統B進行交互,是指系統A訪問系統B時,把引用變數聲明為系統B中的介面類型,該引用變數引用系統B中介面的實現類的實例。

public interface B   {   }

public class C implements B   {   }

public class A   {  B a = new C();  }

2、Java介面本身必須非常穩定,Java介面一旦制定,就不允許隨遇更加,否則對外面使用者及系統本身造成影響3、用抽象類來定製系統中的擴展點,抽象類來完成部分實現,還要一些功能通過它的子類來實現

8、設計模式的設計原則

為什麼要提倡「Design Pattern呢?根本原因是為了代碼復用,增加可維護性。那麼怎麼才能實現代碼復用呢?面向對象有幾個原則:單一職責原則 (Single Responsiblity Principle SRP)開閉原則(Open Closed Principle,OCP)、里氏代換原則(Liskov Substitution Principle,LSP)、依賴倒轉原則(Dependency Inversion Principle,DIP)、介面隔離原則(Interface Segregation Principle,ISP)、合成/聚合復用原則(Composite/Aggregate Reuse Principle,CARP)、最小知識原則(Principle of Least Knowledge,PLK,也叫迪米特法則)。開閉原則具有理想主義的色彩,它是面向對象設計的終極目標。其他幾條,則可以看做是開閉原則的實現方法。
設計模式就是實現了這些原則,從而達到了代碼復用、增加可維護性的目的。 此原則是由Bertrand Meyer提出的。原文是:「Software entities should be open for extension,but closed for modification」。就是說模塊應對擴展開放,而對修改關閉。模塊應盡量在不修改原(是「原」,指原來的代碼)代碼的情況下進行擴展。那麼怎麼擴展呢?我們看工廠模式「factory pattern」:假設中關村有一個賣盜版盤和毛片的小子,我們給他設計一「光碟銷售管理軟體」。我們應該先設計一「光碟」介面。如圖:
[pre]
______________
|<>|
| 光碟 |
|_____________|
|+賣() |
| |
|_____________|
[/pre]
而盜版盤和毛片是其子類。小子通過「DiscFactory」來管理這些光碟。代碼為: public class DiscFactory{public static 光碟getDisc(Stringname){        return(光碟)Class.forName(name).newInstance();    }}有人要買盜版盤,怎麼實現呢? public class 小子{public static void main(String[] args){光碟 d = DiscFactory.getDisc(盜版盤);d.賣();}}如果有一天,這小子良心發現了,開始賣正版軟體。沒關系,我們只要再創建一個「光碟」的子類「正版軟體」就可以了,不需要修改原結構和代碼。怎麼樣?對擴展開放,對修改關閉——「開閉原則」。
工廠模式是對具體產品進行擴展,有的項目可能需要更多的擴展性,要對這個「工廠」也進行擴展,那就成了「抽象工廠模式」。 合成/聚合復用原則(Composite/Aggregate Reuse Principle,CARP)經常又叫做合成復用原則。合成/聚合復用原則就是在一個新的對象裡面使用一些已有的對象,使之成為新對象的一部分;新的對象通過向這些對象的委派達到復用已有功能的目的。它的設計原則是:要盡量使用合成/聚合,盡量不要使用繼承。
就是說要少用繼承,多用合成關系來實現。我曾經這樣寫過程序:有幾個類要與資料庫打交道,就寫了一個資料庫操作的類,然後別的跟資料庫打交道的類都繼承這個。結果後來,我修改了資料庫操作類的一個方法,各個類都需要改動。「牽一發而動全身」!面向對象是要把波動限制在盡量小的范圍。
在Java中,應盡量針對Interface編程,而非實現類。這樣,更換子類不會影響調用它方法的代碼。要讓各個類盡可能少的跟別人聯系,「不要與陌生人說話」。這樣,城門失火,才不至於殃及池魚。擴展性和維護性才能提高。 設計模式分為三種類型,共23種。 創建型模式:單例模式、抽象工廠模式、建造者模式、工廠模式、原型模式。 結構型模式:適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式。 行為型模式:模版方法模式、命令模式、迭代器模式、觀察者模式、中介者模式、備忘錄模式、解釋器模式(Interpreter模式)、狀態模式、策略模式、職責鏈模式(責任鏈模式)、訪問者模式。 按字典序排列簡介如下。
Abstract Factory(抽象工廠模式):提供一個創建一系列相關或相互依賴對象的介面,而無需指定它們具體的類。
Adapter(適配器模式):將一個類的介面轉換成客戶希望的另外一個介面。Adapter模式使得原本由於介面不兼容而不能一起工作的那些類可以一起工作。
Bridge(橋接模式):將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
Builder(建造者模式):將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
Chain of Responsibility(責任鏈模式):為解除請求的發送者和接收者之間耦合,而使多個對象都有機會處理這個請求。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它。
Command(命令模式):將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可取消的操作。
Composite(組合模式):將對象組合成樹形結構以表示「部分-整體」的層次結構。它使得客戶對單個對象和復合對象的使用具有一致性。
Decorator(裝飾模式):動態地給一個對象添加一些額外的職責。就擴展功能而言, 它比生成子類方式更為靈活。
Facade(外觀模式):為子系統中的一組介面提供一個一致的界面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。
Factory Method(工廠模式):定義一個用於創建對象的介面,讓子類決定將哪一個類實例化。Factory Method使一個類的實例化延遲到其子類。
Flyweight(享元模式):運用共享技術有效地支持大量細粒度的對象。
Interpreter(解析器模式):給定一個語言, 定義它的文法的一種表示,並定義一個解釋器, 該解釋器使用該表示來解釋語言中的句子。
Iterator(迭代器模式):提供一種方法順序訪問一個聚合對象中各個元素,而又不需暴露該對象的內部表示。
Mediator(中介模式):用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。
Memento(備忘錄模式):在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到保存的狀態。
Observer(觀察者模式):定義對象間的一種一對多的依賴關系,以便當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並自動刷新。
Prototype(原型模式):用原型實例指定創建對象的種類,並且通過拷貝這個原型來創建新的對象。
Proxy(代理模式):為其他對象提供一個代理以控制對這個對象的訪問。
Singleton(單例模式):保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。 單例模式是最簡單的設計模式之一,但是對於Java的開發者來說,它卻有很多缺陷。在九月的專欄中,David Geary探討了單例模式以及在面對多線程(multi-threading)、類裝載器(class loaders)和序列化(serialization)時如何處理這些缺陷。
State(狀態模式):允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它所屬的類。
Strategy(策略模式):定義一系列的演算法,把它們一個個封裝起來, 並且使它們可相互替換。本模式使得演算法的變化可獨立於使用它的客戶。
Template Method(模板方法模式):定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。
Visitor(訪問者模式):表示一個作用於某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。
從下一節開始,詳細描述以下每一種設計模式。 意圖
定義一個用於創建對象的介面,讓子類決定實例化哪一個類。Factory Method 使一個類的實例化延遲到其子類。
適用性 當一個類不知道它所必須創建的對象的類的時候。 當一個類希望由它的子類來指定它所創建的對象的時候。 當類將創建對象的職責委託給多個幫助子類中的某一個,並且你希望將哪一個幫助子類是代理者這一信息局部化的時候。 意圖
提供一個創建一系列相關或相互依賴對象的介面,而無需指定它們具體的類。
適用性 一個系統要獨立於它的產品的創建、組合和表示時。 一個系統要由多個產品系列中的一個來配置時。 當你要強調一系列相關的產品對象的設計以便進行聯合使用時。 當你提供一個產品類庫,而只想顯示它們的介面而不是實現時。 意圖
將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
適用性 當創建復雜對象的演算法應該獨立於該對象的組成部分以及它們的裝配方式時。 當構造過程必須允許被構造的對象有不同的表示時。 意圖
用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。
適用性 當要實例化的類是在運行時刻指定時,例如,通過動態裝載;或者 為了避免創建一個與產品類層次平行的工廠類層次時;或者 當一個類的實例只能有幾個不同狀態組合中的一種時。建立相應數目的原型並克隆它們可能比每次用合適的狀態手工實例化該類更方便一些。 意圖
保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
適用性 當類只能有一個實例而且客戶可以從一個眾所周知的訪問點訪問它時。 當這個唯一實例應該是通過子類化可擴展的,並且客戶應該無需更改代碼就能使用一個擴展的實例時。 意圖
將一個類的介面轉換成另外一個客戶希望的介面。Adapter 模式使得原本由於介面不兼容而不能一起工作的那些類可以一起工作。
適用性 你想使用一個已經存在的類,而它的介面不符合你的需求。 你想創建一個可以復用的類,該類可以與其他不相關的類或不可預見的類(即那些介面可能不一定兼容的類)協同工作。 (僅適用於對象Adapter)你想使用一些已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的介面。對象適配器可以適配它的父類介面。 意圖
將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
適用性 你不希望在抽象和它的實現部分之間有一個固定的綁定關系。例如這種情況可能是因為,在程序運行時刻實現部分應可以被選擇或者切換。 類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充。這時B r i d g e 模式使你可以對不同的抽象介面和實現部分進行組合,並分別對它們進行擴充。 對一個抽象的實現部分的修改應對客戶不產生影響,即客戶的代碼不必重新編譯。 (C++)你想對客戶完全隱藏抽象的實現部分。在C++中,類的表示在類介面中是可見的。 有許多類要生成。這樣一種類層次結構說明你必須將一個對象分解成兩個部分。Rumbaugh稱這種類層次結構為「嵌套的普化」(nested generalizations )。 你想在多個對象間共享實現(可能使用引用計數),但同時要求客戶並不知道這一點。一個簡單的例子便是Coplien的String類,在這個類中多個對象可以共享同一個字元串表示(StringRep)。 意圖
將對象組合成樹形結構以表示「部分-整體」的層次結構。C o m p o s i t e 使得用戶對單個對象和組合對象的使用具有一致性。
適用性 你想表示對象的部分—整體層次結構。 你希望用戶忽略組合對象與單個對象的不同,用戶將統一地使用組合結構中的所有對象。 意圖
動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更為靈活。
適用性 在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責。 處理那些可以撤消的職責。 當不能採用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,為支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用於生成子類。 意圖
為子系統中的一組介面提供一個一致的界面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。
適用性 當你要為一個復雜子系統提供一個簡單介面時。子系統往往因為不斷演化而變得越來越復雜。大多數模式使用時都會產生更多更小的類。這使得子系統更具可重用性,也更容易對子系統進行定製,但這也給那些不需要定製子系統的用戶帶來一些使用上的困難。Facade可以提供一個簡單的預設視圖,這一視圖對大多數用戶來說已經足夠,而那些需要更多的可定製性的用戶可以越過Facade層。 客戶程序與抽象類的實現部分之間存在著很大的依賴性。引入Facade將這個子系統與客戶以及其他的子系統分離,可以提高子系統的獨立性和可移植性。 當你需要構建一個層次結構的子系統時,使用門面模式定義子系統中每層的入口點。如果子系統之間是相互依賴的,你可以讓它們僅通過Facade進行通訊,從而簡化了它們之間的依賴關系。 意圖
運用共享技術有效地支持大量細粒度的對象。
適用性 一個應用程序使用了大量的對象。 完全由於使用大量的對象,造成很大的存儲開銷。 對象的大多數狀態都可變為外部狀態。 如果刪除對象的外部狀態,那麼可以用相對較少的共享對象取代很多組對象。 應用程序不依賴於對象標識。由於Flyweight對象可以被共享,對於概念上明顯有別的對象,標識測試將返回真值。 意圖
為其他對象提供一種代理以控制對這個對象的訪問。
適用性
在需要用比較通用和復雜的對象指針代替簡單的指針的時候,使用Proxy模式。下面是一 些可以使用Proxy模式常見情況: 遠程代理(Remote Proxy)為一個對象在不同的地址空間提供局部代表。 虛代理(Virtual Proxy)根據需要創建開銷很大的對象。 保護代理(Protection Proxy)控制對原始對象的訪問。保護代理用於對象應該有不同 的訪問許可權的時候。 智能指引(Smart Reference)取代了簡單的指針,它在訪問對象時執行一些附加操作。 它的典型用途包括: 對指向實際對象的引用計數,這樣當該對象沒有引用時,可以自動釋放它(也稱為SmartPointers)。 當第一次引用一個持久對象時,將它裝入內存。 在訪問一個實際對象前,檢查是否已經鎖定了它,以確保其他對象不能改變它。 意圖
使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
適用性 有多個的對象可以處理一個請求,哪個對象處理該請求運行時刻自動確定。 你想在不明確指定接收者的情況下,向多個對象中的一個提交一個請求。 可處理一個請求的對象集合應被動態指定。 意圖
將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可取消的操作
適用性 像上面討論的MenuItem對象那樣,抽象出待執行的動作以參數化某對象。你可用過程語言中的回調(callback)函數表達這種參數化機制。所謂回調函數是指函數先在某處注冊,而它將在稍後某個需要的時候被調用。Command模式是回調機制的一個面向對象的替代品。 在不同的時刻指定、排列和執行請求。一個Command對象可以有一個與初始請求無關的生存期。如果一個請求的接收者可用一種與地址空間無關的方式表達,那麼就可將負責該請求的命令對象傳送給另一個不同的進程並在那兒實現該請求。 支持取消操作。Command的Execute操作可在實施操作前將狀態存儲起來,在取消操作時這個狀態用來消除該操作的影響。Command介面必須添加一個Execute操作,該操作取消上一次Execute調用的效果。執行的命令被存儲在一個歷史列表中。可通過向後和向前遍歷這一列表並分別調用Unexecute和Execute來實現重數不限的「取消」和「重做」。 支持修改日誌,這樣當系統崩潰時,這些修改可以被重做一遍。在Command介面中添加裝載操作和存儲操作,可以用來保持變動的一個一致的修改日誌。從崩潰中恢復的過程包括從磁碟中重新讀入記錄下來的命令並用Execute操作重新執行它們。 用構建在原語操作上的高層操作構造一個系統。這樣一種結構在支持事務(Transaction)的信息系統中很常見。一個事務封裝了對數據的一組變動。Command模式提供了對事務進行建模的方法。Command有一個公共的介面,使得你可以用同一種方式調用所有的事務。同時使用該模式也易於添加新事務以擴展系統。 意圖
給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
適用性 當有一個語言需要解釋執行, 並且你可將該語言中的句子表示為一個抽象語法樹時,可使用解釋器模式。而當存在以下情況時該模式效果最好: 該文法簡單對於復雜的文法, 文法的類層次變得龐大而無法管理。此時語法分析程序生成器這樣的工具是更好的選擇。它們無需構建抽象語法樹即可解釋表達式, 這樣可以節省空間而且還可能節省時間。 效率不是一個關鍵問題最高效的解釋器通常不是通過直接解釋語法分析樹實現的, 而是首先將它們轉換成另一種形式。例如,正則表達式通常被轉換成狀態機。但即使在這種情況下, 轉換器仍可用解釋器模式實現, 該模式仍是有用的。 意圖
提供一種方法順序訪問一個聚合對象中各個元素, 而又不需暴露該對象的內部表示。
適用性 訪問一個聚合對象的內容而無需暴露它的內部表示。 支持對聚合對象的多種遍歷。 為遍歷不同的聚合結構提供一個統一的介面(即, 支持多態迭代)。 意圖
用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。
適用性 一組對象以定義良好但是復雜的方式進行通信。產生的相互依賴關系結構混亂且難以理解。 一個對象引用其他很多對象並且直接與這些對象通信,導致難以復用該對象。 想定製一個分布在多個類中的行為,而又不想生成太多的子類。 意圖
在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到保存的狀態。
適用性 必須保存一個對象在某一個時刻的(部分)狀態, 這樣以後需要時它才能恢復到先前的狀態。 如果一個用介面來讓其它對象直接得到這些狀態,將會暴露對象的實現細節並破壞對象的封裝性。 意圖
定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時, 所有依賴於它的對象都得到通知並被自動更新。
適用性 當一個抽象模型有兩個方面, 其中一個方面依賴於另一方面。將這二者封裝在獨立的對象中以使它們可以各自獨立地改變和復用。 當對一個對象的改變需要同時改變其它對象, 而不知道具體有多少對象有待改變。 當一個對象必須通知其它對象,而它又不能假定其它對象是誰。換言之,你不希望這些對象是緊密耦合的。 意圖
允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。
適用性 一個對象的行為取決於它的狀態, 並且它必須在運行時刻根據狀態改變它的行為。 一個操作中含有龐大的多分支的條件語句,且這些分支依賴於該對象的狀態。這個狀態通常用一個或多個枚舉常量表示。通常, 有多個操作包含這一相同的條件結構。State模式將每一個條件分支放入一個獨立的類中。這使得你可以根據對象自身的情況將對象的狀態作為一個對象,這一對象可以不依賴於其他對象而獨立變化。 意圖
定義一系列的演算法,把它們一個個封裝起來, 並且使它們可相互替換。本模式使得演算法可獨立於使用它的客戶而變化。
適用性 許多相關的類僅僅是行為有異。「策略」提供了一種用多個行為中的一個行為來配置一個類的方法。 需要使用一個演算法的不同變體。例如,你可能會定義一些反映不同的空間/時間權衡的演算法。當這些變體實現為一個演算法的類層次時,可以使用策略模式。 演算法使用客戶不應該知道的數據。可使用策略模式以避免暴露復雜的、與演算法相關的數據結構。 一個類定義了多種行為, 並且這些行為在這個類的操作中以多個條件語句的形式出現。將相關的條件分支移入它們各自的Strategy類中以代替這些條件語句。 意圖
定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。Te m p l a t e M e t h o d 使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。
適用性 一次性實現一個演算法的不變的部分,並將可變的行為留給子類來實現。 各子類中公共的行為應被提取出來並集中到一個公共父類中以避免代碼重復。這是Opdyke和Johnson所描述過的「重分解以一般化」的一個很好的例子。首先識別現有代碼中的不同之處,並且將不同之處分離為新的操作。最後,用一個調用這些新的操作的模板方法來替換這些不同的代碼。 控制子類擴展。模板方法只在特定點調用「hook」操作,這樣就只允許在這些點進行擴展。 意圖
表示一個作用於某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。
適用性 一個對象結構包含很多類對象,它們有不同的介面,而你想對這些對象實施一些依賴於其具體類的操作。 需要對一個對象結構中的對象進行很多不同的並且不相關的操作,而你想避免讓這些操作「污染」這些對象的類。Visitor使得你可以將相關的操作集中起來定義在一個類中。當該對象結構被很多應用共享時,用Visitor模式讓每個應用僅包含需要用到的操作。 定義對象結構的類很少改變,但經常需要在此結構上定義新的操作。改變對象結構類需要重定義對所有訪問者的介面,這可能需要很大的代價。如果對象結構類經常改變,那麼可能還是在這些類中定義這些操作較好。

9、C++ VS中用MFC新建子類繼承CEdit類,給編輯框賦予初值,怎麼實現?

哈哈
PreSubclassWindow
PreSubclassWindow是一個很好的定製控制項的位置。如果我們通過重載CWnd::PreCreateWindow定製控制項,而用戶在對話框中使用控制項。由於對話框中的控制項窗口是通過CreateDlgIndirect創建,不經過CWnd::CreateEx函數,PreCreateWindow函數不會被調用。
其實,用戶要在對話框中使用定製控制項,必須用DDX或者SubclassDlgItem函數子類化控制項,這時PreSubclassWindow一定會被調用。
如果用戶直接創建定製控制項窗口,CWnd::CreateEx函數就一定會被調用,控制項窗口一定會被子類化以安裝MFC消息泵。所以在MFC中,PreSubclassWindow是創建窗口的必經之路。
所以重寫PreSubclassWindow就可以啦-_-

10、classloader載入機制,是否可以自己定義一個java.lang.string類,為什麼

1.類載入器深入剖析
Java虛擬機與程序的生命周期 :
當我們執行一個java程序的時候 , 會啟動一個JVM進程 , 當程序執行完之後 , JVM進程就消亡了 ;
在如下情況下JVM將結束聲明周期 :
System.exit(int)方法 , 當執行這個方法的時候 , 虛擬機會退出 ; 這個方法傳入一個整形參數 , 這個參數是狀態嗎 : 如果這個整形是 0 的話 , 就是正常退出 , 如果不是0的話 , 就是異常退出 ;
程序正常結束 ;
程序執行過程中 , 遇到了異常或錯誤 , 而異常終止 : 如果我們在程序中出現了異常 , 而不去處理 , 會將異常一直拋給main函數 , main函數會將異常拋給JVM , JVM如果處理不了異常 , JVM就會異常退出 ;
由於操作系統出現錯誤導致JVM進程終止 : JVM所依賴的平台出現錯誤 , 導致JVM終止 ;

2.類的載入,連接和初始化
載入 : 查找並載入類的二進制數據 , 將class位元組碼文件載入到內存中 ;
連接 :

-
驗證
: 確保被載入的類的正確性 , 使用javac 編譯工具生成的位元組碼文件能通過驗證 , 如果不是由javac編譯生成的位元組碼文件 , 如果自己生成的位元組碼文件不符合JVM虛擬機對位元組碼文件的要求的話 , 可能會出現驗證通不過的情況 ; 比如說隨便拿一個文件 , 將後綴名直接修改為.class , 這樣的位元組碼文件肯定不合法 ;

-
准備
: 為類的靜態變數分配內存 , 並將其初始化為默認值 ;

-
解析
: 把類中的符號引用轉為直接引用 ;
初始化 : 為類的靜態變數賦予正確的初始值(正確的值指的是用戶賦的值) ;
-好像這個與連接階段的准備有些重復 , 在連接的准備階段只是賦予初始變數 , 如果用戶給這個變數賦了初始值 , 那麼這個變數在連接的准備階段仍然會賦予初始值 ;

-在這個階段 , 才會真正的將初始值賦給靜態變數 ;

Java程序對類的使用方式有 主動使用 和 被動使用 ;
所有的JVM實現 , 必須在每個類或者介面 , 被java程序 「首次主動使用」 時才初始化他們 ;
主動使用 :
創建類的實例 ;
訪問某個類或介面的靜態變數 , 或者對該靜態變數賦值 ;
調用類的靜態方法 ;
反射 : Class.forName(「類名」) ;
初始化一個類的子類 , 看做對父類的主動使用 ;
java虛擬機啟動的時候 , 被標明啟動類的類 , 即包含main方法的類 , 程序的入口 ;

除了上面6種主動使用之外 , 其它的情況均為被動使用 , 其它情況都不會執行第三步初始化 ;

3.類的載入
(1)概念

類的載入 : 指的是將類的.class文件中的二進制數據讀入到內存中 , 將其放在運行時數據區的方法區內 , 然後再堆區創建一個java.lang.Class對象 , 用來封裝類在方法區內的數據結構 ;
反射 : 反射就是跟句堆區的位元組碼文件 , 獲取方法去的數據結構 ;
解析 : Class對象是由JVM自己創建的 , 所有的對象都是經過Class對象創建 , 這個Class對象是反射的入口, 通過Class對象 , 可以關聯到目標class位元組碼文件的內部結構 ;

所有的類對應的Class對象都是唯一的一個 , 這個類是由JVM進行創建的 , 並且只有JVM才會創建Class對象 ;

類載入的最終產品是位於堆區中的Class對象 , Class對象封裝了類在方法區內的數據結構 , 並且向Java程序員提供了訪問方法區內的數據結構的介面(反射用的介面) ;

(2)載入.class文件的方式
從本地系統中直接載入 : 編譯好的.class位元組碼文件直接從硬碟中載入 ;
通過網路下載.class文件 : 將class位元組碼文件放在網路空間中 , 使用URLClassLoader來載入在網路上的.class位元組碼文件 , 使用默認的父親委託機制載入位元組碼文件 ;
從zip , jar 等壓縮文件中載入位元組碼文件 : 在開發的時候 , 導入jar包 , 就是這種方式 ;
從專有的資料庫中提取位元組碼文件 ;
將java源文件動態編譯為位元組碼文件 ;

(3)類載入器
l Java虛擬機自帶的類載入器 :
-根類載入器 ( Bootstrap ) : 是C++寫的 , 程序員無法再java代碼中獲取這個類 , 如果使用getClassLoader()方法獲取到的是一個null值 ;
package jvm;
Java代碼
public class ClassLoaderTest {
public static void main(String[] args) throws Exception {
//java.lang包下的類使用的是跟類載入器進行載入的
Class clazz = Class.forName("java.lang.String");
System.out.println(clazz.getClassLoader());
//自定義的類使用的是應用類載入器(系統載入器)
Class clazz2 = Class.forName("jvm.C");
System.out.println(clazz2.getClassLoader());
}
}
class C{}
執行結果 :
null
Java代碼
sun.misc.Launcher$AppClassLoader@1372a1a
-擴展類載入器 ( Extension ) : Java編寫 ;
-系統類載入器(應用載入器) ( System ) : Java編寫 ;

用戶自定義的類載入器 :
-自定義的類載入器都是java.lang.ClassLoader子類 ;
-用戶可以定製類的載入方式

String類是由根類載入器進行載入的 , 我們可以調用Class對象的

關於代理中創建對象的類載入器 : 創建代理對象的時候 , 動態創建一個類 , 然後使用指定的類載入器將這個類載入到內存中 , 然後用載入到內存中的類生成代理對象 ;
創建代理對象的方法 : newProxyInstance(ClassLoader loader , Class [] Interfaces , InvocationHandler h )
loader 是定義的代理類的類載入器 , 中間的介面數組是代理類的要實現的介面列表 , h 是指派方法調用的調用處理程序 ;

類載入器並不需要在某個類被 「首次主動使用」 時再載入它 :
-預載入機制 : JVM規范允許類載入器在預料某個類將要被使用的時就預先載入它 ;
-報錯時機 : 如果在預載入的過程中遇到了位元組碼文件缺失或者存在錯誤的情況 , 類載入器會在程序首次主動使用(上面提到的六種情況)該類的時候報錯(LinkageError錯誤) ;
-不報錯時機 : 如果這個錯誤的位元組碼文件所對應的類一直沒有被使用 , 那麼類載入器就不會報告錯誤 ,即便有錯誤也不會報錯 ;

LinkageError : 這個錯誤是Error的子類 , 程序不能處理這些錯誤 , 這些錯誤都是由虛擬機來處理 , 這個錯誤表示出錯的是子類 , 在一定程序上依賴於另一個類 , 在編譯了前面一個類的時候 , 與後面所依賴的類出現了不兼容的情況 ;
例如 : 我們使用了jdk 1.6 在編譯一個程序 , 但是運行環境是jre1.5的 , 就會出現LinkageError錯誤 ;
4.類的連接
(1)定義
類被載入之後 , 就進入鏈接階段 ; 鏈接 : 將已讀入內存的二進制數據合並到虛擬機的運行時環境中去 ;
鏈接顧名思義就是講類與類之間進行關聯 , 例如我們在類A中調用了類B , 在鏈接過程中 , 就將A與B進行鏈接 ,將面向對象語言轉化為面向過程語言 ;

(2)類的驗證
類文件的結構檢查 : 確保類文件遵從java類文件的固定格式 , 開始類的描述 , 聲明 , 方法調用格式等 ;
語義檢查 : 確保類本身符合java語言的語法規定 , 比如final類型的類沒有子類 , final類型的方法沒有被覆蓋 ,在eclipse中這種錯誤編譯的時候不能通過 , 但是通過其他的方法可以生成錯誤的位元組碼文件 , 這里就是檢測惡意生成的位元組碼文件 ;
位元組碼驗證 : 確保位元組碼流可以被JVM安全的執行 , 位元組碼流代表java方法(包括靜態方法和實例方法) , 它是由被稱作操作碼的單位元組指令組成的序列 , 每一個操作碼後面跟著一個或多個操作數 , 位元組碼驗證步驟會檢查每個操作碼是否合法 , 即是否有著合法的操作數 ;
下面是指令碼組成的序列 , 類似於微指令 :

Jvm編譯指令代碼代碼
// Compiled from ByteToCharCp1122.java (version 1.5 : 49.0, super bit)
public class sun.io.ByteToCharCp1122 extends sun.io.ByteToCharSingleByte {

// Field descriptor #17 Lsun/nio/cs/ext/IBM1122;
private static final sun.nio.cs.ext.IBM1122 nioCoder;

// Method descriptor #18 ()Ljava/lang/String;
// Stack: 1, Locals: 1
public java.lang.String getCharacterEncoding();
0 ldc <String "Cp1122"> [1]
2 areturn
Line numbers:
[pc: 0, line: 25]

// Method descriptor #2 ()V
// Stack: 2, Locals: 1
public ByteToCharCp1122();
0 aload_0 [this]
1 invokespecial sun.io.ByteToCharSingleByte() [25]
4 aload_0 [this]
5 getstatic sun.io.ByteToCharCp1122.nioCoder : sun.nio.cs.ext.IBM1122 [23]
8 invokevirtual sun.nio.cs.ext.IBM1122.getDecoderSingleByteMappings() : java.lang.String [27]
11 putfield sun.io.ByteToCharSingleByte.byteToCharTable : java.lang.String [24]
14 return
Line numbers:
[pc: 0, line: 28]
[pc: 4, line: 29]
[pc: 14, line: 30]

// Method descriptor #2 ()V
// Stack: 2, Locals: 0
static {};
0 new sun.nio.cs.ext.IBM1122 [15]
3 p
4 invokespecial sun.nio.cs.ext.IBM1122() [26]
7 putstatic sun.io.ByteToCharCp1122.nioCoder : sun.nio.cs.ext.IBM1122 [23]
10 return
Line numbers:
[pc: 0, line: 22]
}
l 二進制兼容性的驗證 : 確保相互引用的類之間協調一致的 ; 例如在A類的a()方法中調用B類的b()方法 , JVM在驗證A類的時候 , 會驗證B類的b()方法 , 加入b()方法不存在 , 或者版本不兼容(A,B兩類使用不同的JDK版本編譯) , 會拋出NoSuchMethodError錯誤 ;

(3)准備階段
在准備階段 , JVM為類的靜態變數分配內存空間 , 並設置默認的初始值 . 例如下面的Sample類 , 在准備階段 ,為int類型的靜態變數分配4個位元組 , 並賦予初始值 0 ; 為long 類型的靜態變數 b , 分配8個位元組 , 並賦予初始值 0 ;
PS : 在java中基本類型變數佔用的空間是一定的 , java運行在JVM上的 , 在C中 , 就要根據平台變化而變化了 ;

public class Sample {
Java代碼
private static int a = 1 ;
private static long b ;
static {
b = 2 ;
}
(4)類的解析
在解析階段 , JVM 會把類的二進制數據中的符號引用替換為直接引用 , 例如在A類中的a()方法引用B類中的b()方法 ;
在A類的二進制數據中包含了一個對B類的b()方法的符號引用 , 這個符號引用由b()方法的全名和相關的描述符組成 , 在Java解析階段 , 就會把這個符號引用替換為指針 , 這個指針就是C語言中的指針了 , 該指針指向B類的b()方法在方法區中的內存位置 , 這個指針就是直接引用 ;

5.類的初始化
在初始化階段 , Java虛擬機執行類的初始化操作 , 為類的靜態變數賦予初始值 , 在程序中 , 靜態變數初始化有兩種途徑 :
直接在聲明處進行初始化 , 例如下面的Sample中的 變數a ;
在靜態代碼塊中進行初始化 , 例如下面的Sample中的變數b ;

Java代碼
public class Sample {
private static int a = 1 ;
private static long b ;
static {
b = 2 ;
}
}

6.面試題介紹

Java代碼
public class PrepareOrInit {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
System.out.println(singleton.count1);
System.out.println(singleton.count2);
}
}
class Singleton{
private static Singleton singleton = new Singleton() ;
public static int count1 ;
public static int count2 = 0 ;
private Singleton(){
count1 ++ ;
count2 ++ ;
}
public static Singleton getInstance(){
return singleton ;
}
}
執行結果 : 1 0

分析 : 這段代碼與類的鏈接中的准備階段 和 初始化階段 有關系 , 准備階段是給靜態的欄位賦予默認值 , 初始化階段給靜態變數賦予正確的值 , 即用戶的值 ;
在主函數中 , 調用了類的靜態方法 , 相當於主動使用 , 這里調用了類的靜態方法 ;
之後進行連接的准備操作 , 給類中的靜態變數賦予初值 , singleton值為null , count1 與 count2 值為0 ;
執行初始化操作 , 給類中的靜態變數賦予正確的值 , 給singleton變數賦予正確的值 , 調用構造方法 , 此時count1與 count2執行自增操作 , 兩者都變成1 , 然後執行count1的賦予正確值操作 , 這里用戶沒有賦值操作 , count2 用戶進行了 賦值為0的操作 , 0將原來的1覆蓋掉了 , 因此結果為 1 , 0 ;

Java代碼
public class PrepareOrInit {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
System.out.println(singleton.count1);
System.out.println(singleton.count2);
}
}
class Singleton{
public static int count1 ;
public static int count2 = 0 ;
private static Singleton singleton = new Singleton() ;
private Singleton(){
count1 ++ ;
count2 ++ ;
}
public static Singleton getInstance(){
return singleton ;
}
}
執行結果 : 1 1

在准備階段count1 和 count2 都賦值為0 , 然後在初始化階段 , 全部賦值為1 ;

熱點內容
新泰特產 發布:2020-09-14 19:00:13 瀏覽:505
適合開業的音樂 發布:2020-09-17 11:28:55 瀏覽:503
送男生十字綉 發布:2020-09-16 16:05:07 瀏覽:503
神秘商店皮膚贈送 發布:2020-09-16 15:38:37 瀏覽:503
手繪聖誕賀卡 發布:2020-09-16 14:48:57 瀏覽:503
青島初中升學率 發布:2020-09-16 09:55:57 瀏覽:503
送媽媽的生日蛋糕圖片 發布:2020-09-16 09:10:18 瀏覽:503
夢生日 發布:2020-09-16 18:24:33 瀏覽:502
紙禮物盒 發布:2020-09-16 15:55:47 瀏覽:502
wow角色定製 發布:2020-09-16 14:46:32 瀏覽:502