當前位置:首頁 » 編程語言 » java開發實例

java開發實例

發布時間: 2022-12-31 15:25:28

㈠ 用java編寫一個簡單例子,題目如下

package test;

public class Student {
private String name;
private String id;
private String clazz;
private int age;
private String address;

/**
* sayHello方法
*/
public void sayHello() {
System.out.println("學號為" + this.id + "的同學的具體信息如下:");
System.out.println("姓名:" + this.name);
System.out.println("班級:" + this.clazz);
System.out.println("年齡:" + this.age);
System.out.println("家庭住址:" + this.address);
}

/**
* 測試方法
*
* @param args
*/
public static void main(String[] args) {
// 第一問
Student student = new Student();
student.setAddress("網路知道");
student.setAge(1);
student.setClazz("一班");
student.setId("071251000");
student.setName("lsy605604013");
student.sayHello();

// 第二問
Student studentNew = new Student();
studentNew.setAddress("搜搜知道");
studentNew.setAge(2);
studentNew.setClazz("二班");
studentNew.setId("071251001");
studentNew.setName("lady");
if (student.getAge() < studentNew.getAge())
studentNew.sayHello();
else if (student.getAge() > studentNew.getAge())
student.sayHello();
else
System.out.println("兩人一樣大");

}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getClazz() {
return clazz;
}

public void setClazz(String clazz) {
this.clazz = clazz;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

}

㈡ java nio 開發實例

首先了解下所謂的java nio是個什麼東西!

傳統的並發型伺服器設計是利用阻塞型網路I/O 以多線程的模式來實現的 然而由

於系統常常在進行網路讀寫時處於阻塞狀態 會大大影響系統的性能 自Java 開始引入

了NIO(新I/O) API 通過使用非阻塞型I/O 實現流暢的網路讀寫操作 為開發高性能並發

型伺服器程序提供了一個很好的解決方案 這就是java nio

首先來看下傳統的阻塞型網路 I/O的不足

Java 平台傳統的I/O 系統都是基於Byte(位元組)和Stream(數據流)的 相應的I/O 操

作都是阻塞型的 所以伺服器程序也採用阻塞型I/O 進行數據的讀 寫操作 本文以TCP

長連接模式來討論並發型伺服器的相關設計 為了實現伺服器程序的並發性要求 系統由一

個單獨的主線程來監聽用戶發起的連接請求 一直處於阻塞狀態 當有用戶連接請求到來時

程序都會啟一個新的線程來統一處理用戶數據的讀 寫操作

這種模式的優點是簡單 實用 易管理 然而缺點也是顯而易見的 由於是為每一個客

戶端分配一個線程來處理輸入 輸出數據 其線程與客戶機的比例近似為 隨著線程

數量的不斷增加 伺服器啟動了大量的並發線程 會大大加大系統對線程的管理開銷 這將

成為吞吐量瓶頸的主要原因 其次由於底層的I/O 操作採用的同步模式 I/O 操作的阻塞管

理粒度是以服務於請求的線程為單位的 有可能大量的線程會閑置 處於盲等狀態 造成I/O

資源利用率不高 影響整個系統的性能

對於並發型伺服器 系統用在阻塞型I/O 等待和線程間切換的時間遠遠多於CPU 在內

存中處理數據的時間 因此傳統的阻塞型I/O 已經成為制約系統性能的瓶頸 Java 版本

後推出的NIO 工具包 提供了非阻塞型I/O 的非同步輸入輸出機制 為提高系統的性能提供

了可實現的基礎機制

NIO 包及工作原理

針對傳統I/O 工作模式的不足 NIO 工具包提出了基於Buffer(緩沖區) Channel(通

道) Selector(選擇器)的新模式 Selector(選擇器) 可選擇的Channel(通道)和

SelectionKey(選擇鍵)配合起來使用 可以實現並發的非阻塞型I/O 能力

NIO 工具包的成員

Buffer(緩沖器)

Buffer 類是一個抽象類 它有 個子類分別對應於七種基本的數據類型 ByteBuffer

CharBuffer DoubleBuffer FloatBuffer IntBuffer LongBuffer 和ShortBuffer 每一個Buffer

對象相當於一個數據容器 可以把它看作內存中的一個大的數組 用來存儲和提取所有基本

類型(boolean 型除外)的數據 Buffer 類的核心是一塊內存區 可以直接對其執行與內存有關

的操作 利用操作系統特性和能力提高和改善Java 傳統I/O 的性能

Channel(通道)

Channel 被認為是NIO 工具包的一大創新點 是(Buffer)緩沖器和I/O 服務之間的通道

具有雙向性 既可以讀入也可以寫出 可以更高效的傳遞數據 我們這里主要討論

ServerSocketChannel 和SocketChannel 它們都繼承了SelectableChannel 是可選擇的通道

分別可以工作在同步和非同步兩種方式下(這里的可選擇不是指可以選擇兩種工作方式 而是

指可以有選擇的注冊自己感興趣的事件) 當通道工作在同步方式時 它的功能和編程方法

與傳統的ServerSocket Socket 對象相似 當通道工作在非同步工作方式時 進行輸入輸出處

理不必等到輸入輸出完畢才返回 並且可以將其感興趣的(如 接受操作 連接操作 讀出

操作 寫入操作)事件注冊到Selector 對象上 與Selector 對象協同工作可以更有效率的支

持和管理並發的網路套接字連接

Selector(選擇器)和SelectionKey(選擇鍵)

各類 Buffer 是數據的容器對象 各類Channel 實現在各類Buffer 與各類I/O 服務間傳輸

數據 Selector 是實現並發型非阻塞I/O 的核心 各種可選擇的通道將其感興趣的事件注冊

到Selector 對象上 Selector 在一個循環中不斷輪循監視這各些注冊在其上的Socket 通道

SelectionKey 類則封裝了SelectableChannel 對象在Selector 中的注冊信息 當Selector 監測

到在某個注冊的SelectableChannel 上發生了感興趣的事件時 自動激活產生一個SelectionKey

對象 在這個對象中記錄了哪一個SelectableChannel 上發生了哪種事件 通過對被激活的

SelectionKey 的分析 外界可以知道每個SelectableChannel 發生的具體事件類型 進行相應的

處理

NIO 工作原理

通過上面的討論 我們可以看出在並發型伺服器程序中使用NIO 實際上是通過網路事

件驅動模型實現的 我們應用Select 機制 不用為每一個客戶端連接新啟線程處理 而是將

其注冊到特定的Selector 對象上 這就可以在單線程中利用Selector 對象管理大量並發的網

絡連接 更好的利用了系統資源 採用非阻塞I/O 的通信方式 不要求阻塞等待I/O 操作完

成即可返回 從而減少了管理I/O 連接導致的系統開銷 大幅度提高了系統性能

當有讀或寫等任何注冊的事件發生時 可以從Selector 中獲得相應的

SelectionKey 從SelectionKey 中可以找到發生的事件和該事件所發生的具體的

SelectableChannel 以獲得客戶端發送過來的數據 由於在非阻塞網路I/O 中採用了事件觸

發機制 處理程序可以得到系統的主動通知 從而可以實現底層網路I/O 無阻塞 流暢地讀

寫 而不像在原來的阻塞模式下處理程序需要不斷循環等待 使用NIO 可以編寫出性能更

好 更易擴展的並發型伺服器程序

並發型伺服器程序的實現代碼

應用 NIO 工具包 基於非阻塞網路I/O 設計的並發型伺服器程序與以往基於阻塞I/O 的

實現程序有很大不同 在使用非阻塞網路I/O 的情況下 程序讀取數據和寫入數據的時機不

是由程序員控制的 而是Selector 決定的 下面便給出基於非阻塞網路I/O 的並發型伺服器

程序的核心代碼片段

import java io * //引入Java io包

import * //引入包

import java nio channels * //引入Java nio channels包

import java util * //引入Java util包

public class TestServer implements Runnable

{

/**

* 伺服器Channel對象 負責接受用戶連接

*/

private ServerSocketChannel server

/**

* Selector對象 負責監控所有的連接到伺服器的網路事件的發生

*/

private Selector selector

/**

* 總的活動連接數

*/

private int activeSockets

/**

* 伺服器Channel綁定的埠號

*/

private int port

/**

*

* 構造函數

*/

public TestServer()throws IOException

{

activeSockets=

port= //初始化伺服器Channel綁定的埠號為

selector= Selector open() //初始化Selector對象

server=ServerSocketChannel open() //初始化伺服器Channel對象

ServerSocket socket=server socket() //獲取伺服器Channel對應的//ServerSocket對象

socket bind(new InetSocketAddress(port)) //把Socket綁定到監聽埠 上

nfigureBlocking(false) //將伺服器Channel設置為非阻塞模式

server register(selector SelectionKey OP_ACCEPT) //將伺服器Channel注冊到

Selector對象 並指出伺服器Channel所感興趣的事件為可接受請求操作

}

public void run()

{

while(true)

{

try

{

/**

*應用Select機制輪循是否有用戶感興趣的新的網路事件發生 當沒有

* 新的網路事件發生時 此方法會阻塞 直到有新的網路事件發生為止

*/

selector select()

}

catch(IOException e)

{

continue //當有異常發生時 繼續進行循環操作

}

/**

* 得到活動的網路連接選擇鍵的集合

*/

Set<SelectionKey> keys=selector selectedKeys()

activeSockets=keys size() //獲取活動連接的數目

if(activeSockets== )

{

continue //如果連接數為 則繼續進行循環操作

}

/**

/**

* 應用For—Each循環遍歷整個選擇鍵集合

*/

for(SelectionKey key :keys)

{

/**

* 如果關鍵字狀態是為可接受 則接受連接 注冊通道 以接受更多的*

事件 進行相關的伺服器程序處理

*/

if(key isAcceptable())

{

doServerSocketEvent(key)

continue

}

/**

* 如果關鍵字狀態為可讀 則說明Channel是一個客戶端的連接通道

* 進行相應的讀取客戶端數據的操作

*/

if(key isReadable())

{

doClientReadEvent(key)

continue

}

/**

* 如果關鍵字狀態為可寫 則也說明Channel是一個客戶端的連接通道

* 進行相應的向客戶端寫數據的操作

*/

if(key isWritable())

{

doClinetWriteEvent(key)

continue

}

}

}

}

/**

* 處理伺服器事件操作

* @param key 伺服器選擇鍵對象

*/

private void doServerSocketEvent(SelectionKey key)

{

SocketChannel client=null

try

{

ServerSocketChannel server=(ServerSocketChannel)key channel()

client=server accept()

if(client==null)

{

return

}

nfigureBlocking(false) //將客戶端Channel設置為非阻塞型

/**

/**

* 將客戶端Channel注冊到Selector對象上 並且指出客戶端Channel所感

* 興趣的事件為可讀和可寫

*/

client register(selector SelectionKey OP_READ|SelectionKey OP_READ)

}catch(IOException e)

{

try

{

client close()

}catch(IOException e ){}

}

}

/**

* 進行向客戶端寫數據操作

* @param key 客戶端選擇鍵對象

*/

private void doClinetWriteEvent(SelectionKey key)

{

代碼實現略

}

/**

* 進行讀取客戶短數據操作

* @param key 客戶端選擇鍵對象

*/

private void doClientReadEvent(SelectionKey key)

{

代碼實現略

}

}

從上面對代碼可以看出 使用非阻塞性I/O進行並發型伺服器程序設計分三個部分

向Selector對象注冊感興趣的事件 從Selector中獲取所感興趣的事件 根據不同的事件進

行相應的處理

結語

通過使用NIO 工具包進行並發型伺服器程序設計 一個或者很少幾個Socket 線程就可

以處理成千上萬個活動的Socket 連接 大大降低了伺服器端程序的開銷 同時網路I/O 採取

非阻塞模式 線程不再在讀或寫時阻塞 操作系統可以更流暢的讀寫數據並可以更有效地向

CPU 傳遞數據進行處理 以便更有效地提高系統的性能

看到這里相信你看了不止 分鍾了吧 我說 分鍾其實就是想讓大家能夠輕松的讀下去(雞蛋 )

好了 到這里大家應該對java nio有個初步的了解了吧~~~

lishixin/Article/program/Java/hx/201311/27190

㈢ 誰能介紹一下JAVA平台開發中最長用的幾種設計模式~最好是通俗一些的並且有實例的~500分酬謝

例子很另類,不過還比較好懂

工廠模式, 工廠方法模式,單例模式, 外觀(Facade)模式, 觀察者(Observer)模式,橋接(Bridge)模式都是比較常用的,不同的項目有不同的設計方向,可以參考的設計模式也不盡相同,沒有定數,只是上面這幾個模式用的比較多一些。

其他的模式我找了一下,都列出來了。

======================
Java常用的設計模式
創建型模式

1、FACTORY—追MM少不了請吃飯了,麥當勞的雞翅和肯德基的雞翅都是MM愛吃的東西,雖然口味有所不同,但不管你帶MM去麥當勞或肯德基,只管向服務員說「來四個雞翅」就行了。麥當勞和肯德基就是生產雞翅的Factory

工廠模式:客戶類和工廠類分開。消費者任何時候需要某種產品,只需向工廠請求即可。消費者無須修改就可以接納新產品。缺點是當產品修改時,工廠類也要做相應的修改。如:如何創建及如何向客戶端提供。

2、BUILDER—MM最愛聽的就是「我愛你」這句話了,見到不同地方的MM,要能夠用她們的方言跟她說這句話哦,我有一個多種語言翻譯機,上面每種語言都有一個按鍵,見到MM我只要按對應的鍵,它就能夠用相應的語言說出「我愛你」這句話了,國外的MM也可以輕松搞掂,這就是我的「我愛你」builder。(這一定比美軍在伊拉克用的翻譯機好賣)

建造模式:將產品的內部表象和產品的生成過程分割開來,從而使一個建造過程生成具有不同的內部表象的產品對象。建造模式使得產品內部表象可以獨立的變化,客戶不必知道產品內部組成的細節。建造模式可以強制實行一種分步驟進行的建造過程。

3、FACTORY METHOD—請MM去麥當勞吃漢堡,不同的MM有不同的口味,要每個都記住是一件煩人的事情,我一般採用Factory Method模式,帶著MM到服務員那兒,說「要一個漢堡」,具體要什麼樣的漢堡呢,讓MM直接跟服務員說就行了。

工廠方法模式:核心工廠類不再負責所有產品的創建,而是將具體創建的工作交給子類去做,成為一個抽象工廠角色,僅負責給出具體工廠類必須實現的介面,而不接觸哪一個產品類應當被實例化這種細節。

4、PROTOTYPE—跟MM用QQ聊天,一定要說些深情的話語了,我搜集了好多肉麻的情話,需要時只要出來放到QQ裡面就行了,這就是我的情話prototype了。(100塊錢一份,你要不要)

原始模型模式:通過給出一個原型對象來指明所要創建的對象的類型,然後用復制這個原型對象的方法創建出更多同類型的對象。原始模型模式允許動態的增加或減少產品類,產品類不需要非得有任何事先確定的等級結構,原始模型模式適用於任何的等級結構。缺點是每一個類都必須配備一個克隆方法。

5、SINGLETON—俺有6個漂亮的老婆,她們的老公都是我,我就是我們家裡的老公Sigleton,她們只要說道「老公」,都是指的同一個人,那就是我(剛才做了個夢啦,哪有這么好的事)

單例模式:單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例單例模式。單例模式只應在有真正的「單一實例」的需求時才可使用。

結構型模式

6、ADAPTER—在朋友聚會上碰到了一個美女Sarah,從香港來的,可我不會說粵語,她不會說普通話,只好求助於我的朋友kent了,他作為我和Sarah之間的Adapter,讓我和Sarah可以相互交談了(也不知道他會不會耍我)

適配器(變壓器)模式:把一個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面原因不匹配而無法一起工作的兩個類能夠一起工作。適配類可以根據參數返還一個合適的實例給客戶端。

7、BRIDGE—早上碰到MM,要說早上好,晚上碰到MM,要說晚上好;碰到MM穿了件新衣服,要說你的衣服好漂亮哦,碰到MM新做的發型,要說你的頭發好漂亮哦。不要問我「早上碰到MM新做了個發型怎麼說」這種問題,自己用BRIDGE組合一下不就行了

橋梁模式:將抽象化與實現化脫耦,使得二者可以獨立的變化,也就是說將他們之間的強關聯變成弱關聯,也就是指在一個軟體系統的抽象化和實現化之間使用組合/聚合關系而不是繼承關系,從而使兩者可以獨立的變化。

8、COMPOSITE—Mary今天過生日。「我過生日,你要送我一件禮物。」「嗯,好吧,去商店,你自己挑。」「這件T恤挺漂亮,買,這條裙子好看,買,這個包也不錯,買。」「喂,買了三件了呀,我只答應送一件禮物的哦。」「什麼呀,T恤加裙子加包包,正好配成一套呀,小姐,麻煩你包起來。」「……」,MM都會用Composite模式了,你會了沒有?

合成模式:合成模式將對象組織到樹結構中,可以用來描述整體與部分的關系。合成模式就是一個處理對象的樹結構的模式。合成模式把部分與整體的關系用樹結構表示出來。合成模式使得客戶端把一個個單獨的成分對象和由他們復合而成的合成對象同等看待。

9、DECORATOR—Mary過完輪到Sarly過生日,還是不要叫她自己挑了,不然這個月伙食費肯定玩完,拿出我去年在華山頂上照的照片,在背面寫上「最好的的禮物,就是愛你的Fita」,再到街上禮品店買了個像框(賣禮品的MM也很漂亮哦),再找隔壁搞美術設計的Mike設計了一個漂亮的盒子裝起來……,我們都是Decorator,最終都在修飾我這個人呀,怎麼樣,看懂了嗎?

裝飾模式:裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關系的一個替代方案,提供比繼承更多的靈活性。動態給一個對象增加功能,這些功能可以再動態的撤消。增加由一些基本功能的排列組合而產生的非常大量的功能。

10、FACADE—我有一個專業的Nikon相機,我就喜歡自己手動調光圈、快門,這樣照出來的照片才專業,但MM可不懂這些,教了半天也不會。幸好相機有Facade設計模式,把相機調整到自動檔,只要對准目標按快門就行了,一切由相機自動調整,這樣MM也可以用這個相機給我拍張照片了。

門面模式:外部與一個子系統的通信必須通過一個統一的門面對象進行。門面模式提供一個高層次的介面,使得子系統更易於使用。每一個子系統只有一個門面類,而且此門面類只有一個實例,也就是說它是一個單例模式。但整個系統可以有多個門面類。

11、FLYWEIGHT—每天跟MM發簡訊,手指都累死了,最近買了個新手機,可以把一些常用的句子存在手機里,要用的時候,直接拿出來,在前面加上MM的名字就可以發送了,再不用一個字一個字敲了。共享的句子就是Flyweight,MM的名字就是提取出來的外部特徵,根據上下文情況使用。

享元模式:FLYWEIGHT在拳擊比賽中指最輕量級。享元模式以共享的方式高效的支持大量的細粒度對象。享元模式能做到共享的關鍵是區分內蘊狀態和外蘊狀態。內蘊狀態存儲在享元內部,不會隨環境的改變而有所不同。外蘊狀態是隨環境的改變而改變的。外蘊狀態不能影響內蘊狀態,它們是相互獨立的。將可以共享的狀態和不可以共享的狀態從常規類中區分開來,將不可以共享的狀態從類里剔除出去。客戶端不可以直接創建被共享的對象,而應當使用一個工廠對象負責創建被共享的對象。享元模式大幅度的降低內存中對象的數量。

12、PROXY—跟MM在網上聊天,一開頭總是「hi,你好」,「你從哪兒來呀?」「你多大了?」「身高多少呀?」這些話,真煩人,寫個程序做為我的Proxy吧,凡是接收到這些話都設置好了自動的回答,接收到其他的話時再通知我回答,怎麼樣,酷吧。

代理模式:代理模式給某一個對象提供一個代理對象,並由代理對象控制對源對象的引用。代理就是一個人或一個機構代表另一個人或者一個機構採取行動。某些情況下,客戶不想或者不能夠直接引用一個對象,代理對象可以在客戶和目標對象直接起到中介的作用。客戶端分辨不出代理主題對象與真實主題對象。代理模式可以並不知道真正的被代理對象,而僅僅持有一個被代理對象的介面,這時候代理對象不能夠創建被代理對象,被代理對象必須有系統的其他角色代為創建並傳入。

行為模式

13、CHAIN OF RESPONSIBLEITY—晚上去上英語課,為了好開溜坐到了最後一排,哇,前面坐了好幾個漂亮的MM哎,找張紙條,寫上「Hi,可以做我的女朋友嗎?如果不願意請向前傳」,紙條就一個接一個的傳上去了,糟糕,傳到第一排的MM把紙條傳給老師了,聽說是個老處女呀,快跑!

責任鏈模式:在責任鏈模式中,很多對象由每一個對象對其下家的引用而接

起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。客戶並不知道鏈上的哪一個對象最終處理這個請求,系統可以在不影響客戶端的情況下動態的重新組織鏈和分配責任。處理者有兩個選擇:承擔責任或者把責任推給下家。一個請求可以最終不被任何接收端對象所接受。

14、COMMAND—俺有一個MM家裡管得特別嚴,沒法見面,只好藉助於她弟弟在我們倆之間傳送信息,她對我有什麼指示,就寫一張紙條讓她弟弟帶給我。這不,她弟弟又傳送過來一個COMMAND,為了感謝他,我請他吃了碗雜醬面,哪知道他說:「我同時給我姐姐三個男朋友送COMMAND,就數你最小氣,才請我吃面。」,:-(

命令模式:命令模式把一個請求或者操作封裝到一個對象中。命令模式把發出命令的責任和執行命令的責任分割開,委派給不同的對象。命令模式允許請求的一方和發送的一方獨立開來,使得請求的一方不必知道接收請求的一方的介面,更不必知道請求是怎麼被接收,以及操作是否執行,何時被執行以及是怎麼被執行的。系統支持命令的撤消。

15、INTERPRETER—俺有一個《泡MM真經》,上面有各種泡MM的攻略,比如說去吃西餐的步驟、去看電影的方法等等,跟MM約會時,只要做一個Interpreter,照著上面的腳本執行就可以了。

解釋器模式:給定一個語言後,解釋器模式可以定義出其文法的一種表示,並同時提供一個解釋器。客戶端可以使用這個解釋器來解釋這個語言中的句子。解釋器模式將描述怎樣在有了一個簡單的文法後,使用模式設計解釋這些語句。在解釋器模式裡面提到的語言是指任何解釋器對象能夠解釋的任何組合。在解釋器模式中需要定義一個代表文法的命令類的等級結構,也就是一系列的組合規則。每一個命令對象都有一個解釋方法,代表對命令對象的解釋。命令對象的等級結構中的對象的任何排列組合都是一個語言。

16、ITERATOR—我愛上了Mary,不顧一切的向她求婚。

Mary:「想要我跟你結婚,得答應我的條件」

我:「什麼條件我都答應,你說吧」

Mary:「我看上了那個一克拉的鑽石」

我:「我買,我買,還有嗎?」

Mary:「我看上了湖邊的那棟別墅」

我:「我買,我買,還有嗎?」

Mary:「你的小弟弟必須要有50cm長」

我腦袋嗡的一聲,坐在椅子上,一咬牙:「我剪,我剪,還有嗎?」

……

迭代子模式:迭代子模式可以順序訪問一個聚集中的元素而不必暴露聚集的內部表象。多個對象聚在一起形成的總體稱之為聚集,聚集對象是能夠包容一組對象的容器對象。迭代子模式將迭代邏輯封裝到一個獨立的子對象中,從而與聚集本身隔開。迭代子模式簡化了聚集的界面。每一個聚集對象都可以有一個或一個以上的迭代子對象,每一個迭代子的迭代狀態可以是彼此獨立的。迭代演算法可以獨立於聚集角色變化。

17、MEDIATOR—四個MM打麻將,相互之間誰應該給誰多少錢算不清楚了,幸虧當時我在旁邊,按照各自的籌碼數算錢,賺了錢的從我這里拿,賠了錢的也付給我,一切就OK啦,俺得到了四個MM的電話。

調停者模式:調停者模式包裝了一系列對象相互作用的方式,使得這些對象不必相互明顯作用。從而使他們可以鬆散偶合。當某些對象之間的作用發生改變時,不會立即影響其他的一些對象之間的作用。保證這些作用可以彼此獨立的變化。調停者模式將多對多的相互作用轉化為一對多的相互作用。調停者模式將對象的行為和協作抽象化,把對象在小尺度的行為上與其他對象的相互作用分開處理。

18、MEMENTO—同時跟幾個MM聊天時,一定要記清楚剛才跟MM說了些什麼話,不然MM發現了會不高興的哦,幸虧我有個備忘錄,剛才與哪個MM說了什麼話我都拷貝一份放到備忘錄裡面保存,這樣可以隨時察看以前的記錄啦。

備忘錄模式:備忘錄對象是一個用來存儲另外一個對象內部狀態的快照的對象。備忘錄模式的用意是在不破壞封裝的條件下,將一個對象的狀態捉住,並外部化,存儲起來,從而可以在將來合適的時候把這個對象還原到存儲起來的狀態。

19、OBSERVER—想知道咱們公司最新MM情報嗎?加入公司的MM情報郵件組就行了,tom負責搜集情報,他發現的新情報不用一個一個通知我們,直接發布給郵件組,我們作為訂閱者(觀察者)就可以及時收到情報啦

觀察者模式:觀察者模式定義了一種一隊多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使他們能夠自動更新自己。

20、STATE—跟MM交往時,一定要注意她的狀態哦,在不同的狀態時她的行為會有不同,比如你約她今天晚上去看電影,對你沒興趣的MM就會說「有事情啦」,對你不討厭但還沒喜歡上的MM就會說「好啊,不過可以帶上我同事么?」,已經喜歡上你的MM就會說「幾點鍾?看完電影再去泡吧怎麼樣?」,當然你看電影過程中表現良好的話,也可以把MM的狀態從不討厭不喜歡變成喜歡哦。

狀態模式:狀態模式允許一個對象在其內部狀態改變的時候改變行為。這個對象看上去象是改變了它的類一樣。狀態模式把所研究的對象的行為包裝在不同的狀態對象里,每一個狀態對象都屬於一個抽象狀態類的一個子類。狀態模式的意圖是讓一個對象在其內部狀態改變的時候,其行為也隨之改變。狀態模式需要對每一個系統可能取得的狀態創立一個狀態類的子類。當系統的狀態變化時,系統便改變所選的子類。

21、STRATEGY—跟不同類型的MM約會,要用不同的策略,有的請電影比較好,有的則去吃小吃效果不錯,有的去海邊浪漫最合適,單目的都是為了得到MM的芳心,我的追MM錦囊中有好多Strategy哦。

策略模式:策略模式針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。策略模式把行為和環境分開。環境類負責維持和查詢行為類,各種演算法在具體的策略類中提供。由於演算法和環境獨立開來,演算法的增減,修改都不會影響到環境和客戶端。

22、TEMPLATE METHOD——看過《如何說服女生上床》這部經典文章嗎?女生從認識到上床的不變的步驟分為巧遇、打破僵局、展開追求、接吻、前戲、動手、愛撫、進去八大步驟(Template method),但每個步驟針對不同的情況,都有不一樣的做法,這就要看你隨機應變啦(具體實現);

模板方法模式:模板方法模式准備一個抽象類,將部分邏輯以具體方法以及具體構造子的形式實現,然後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。先制定一個頂級邏輯框架,而將邏輯的細節留給具體的子類去實現。

23、VISITOR—情人節到了,要給每個MM送一束鮮花和一張卡片,可是每個MM送的花都要針對她個人的特點,每張卡片也要根據個人的特點來挑,我一個人哪搞得清楚,還是找花店老闆和禮品店老闆做一下Visitor,讓花店老闆根據MM的特點選一束花,讓禮品店老闆也根據每個人特點選一張卡,這樣就輕松多了;

訪問者模式:訪問者模式的目的是封裝一些施加於某種數據結構元素之上的操作。一旦這些操作需要修改的話,接受這個操作的數據結構可以保持不變。訪問者模式適用於數據結構相對未定的系統,它把數據結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由的演化。訪問者模式使得增加新的操作變的很容易,就是增加一個新的訪問者類。訪問者模式將有關的行為集中到一個訪問者對象中,而不是分散到一個個的節點類中。當使用訪問者模式時,要將盡可能多的對象瀏覽邏輯放在訪問者類中,而不是放到它的子類中。訪問者模式可以跨過幾個類的等級結構訪問屬於不同的等級結構的成員類。

㈣ 怎樣在Java實例開發的過程中使用進度條

在讀取大型文件或者其它大批量數據輸入操作時 希望能夠通過一個進度條顯示當前的進度 現在在Java中非常容易實現 僅僅需要幾行代碼即可 Java的swing包提供了ProgressMonitorInputStream類 該類提供了自動地彈出進度窗口和事件處理機制 使用這個類也非常方便 只需要把任何一個InputStream作為參數 構造一個新的ProgressMonitorInputStream類 其它不需要任何額外的代碼 即可實現進度窗口的自動生成 ProgressMonitorInputStream類可以和其它InputStream一樣使用 ProgressMonitorInputStream類繼承層次 [pre]java lang Object|+ java io InputStream|+ java io FilterInputStream|+ javax swing ProgressMonitorInputStream[/pre] 構造方法 ProgressMonitorInputStream(Component parentComponent Object message InputStream in)parentComponent 觸發被監視操作的組件message (如果彈出進度顯示窗口) 顯示在進度顯示窗口中的指示信息in 需要監視的輸入流 操作方法 除了在InputStream和FilterInputStream中繼承的方法外 還增加了如下方法 ProgressMonitor getProgressMonitor()//得到當前對象使用的ProgressMonitor對象 int read()int read(byte[] b)int read(byte[] b int off int len)void reset()long skip(long n)//上面幾個方法都是覆蓋了FilterInputStream中的方法 因為需要更新進度指示 void close()//因為需要關閉進度監視對象和窗口 所以覆蓋了FilterInputStream父類中的close方法 示例代碼: import java awt FlowLayout;import java awt event ActionEvent;import java awt event ActionListener;import java io FileInputStream;import java io InputStream;import javax swing JButton;import javax swing JFrame;import javax swing ProgressMonitorInputStream;public class ProgressMonitorTest{public static void main(String[] args){// 創建一個包含 Click me 的窗口final JFrame f =new JFrame( ProgressMonitor Sample );f getContentPane() setLayout(new FlowLayout());JButton b = new JButton( Click me );f getContentPane() add(b);f pack();// 設置按鈕的動作事件b addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){// 這兒使用了新的線程處理按鈕的動作事件 因為我們需要//主窗口的線程響應用戶 這樣你可以多次點擊該按鈕 //會啟動多個讀取文件的線程 主窗口也保持響應 new Thread(){public void run(){try {// 打開文件輸出流 把InputStream包裝在ProgressMonitorInputStream中 //在當前目錄中需要放置一個大文件 建議超過 MInputStream in = new FileInputStream( bigfile dat );ProgressMonitorInputStream pm =new ProgressMonitorInputStream(f Reading a big file in);// 讀取文件 如果總耗時超過 秒 將會自動彈出一個進度監視窗口 // 顯示已讀取的百分比 int c;while((c=pm read()) != ){// 處理代碼}pm close();}catch(Exception ex){ex printStackTrace();}}} start();}});// 設置預設的窗口關閉行為 並顯示窗口 f setDefaultCloseOperation(JFrame EXIT_ON_CLOSE);f setVisible(true);}} lishixin/Article/program/Java/hx/201311/25629

㈤ 學Java有哪些可以練手的項目

1.各種管理系統

源碼下載(實例一):

jsp開發完整的博研圖書館後台管理系統,不使用框架開發的,太完美了

源碼下載(實例二):

javaWeb圖書館管理系統源碼mysql版本

源碼下載(實例三)

GitHub - uboger/LibraryManager: JAVA GUI 圖書館管理系統

源碼下載(實例四):

java swing開發企業人事管理系統源代碼下載

2.簡易的聊天系統

源碼下載(實例一):

java swing開發網路聊天室群聊系統,基於java多線程socket編程

源碼下載(實例二):

java swing開發大貓聊天室源碼,簡單易懂,適合java swing初學者

源碼下載(實例三):

java websocket開發簡單聊天室系統,實現群聊與一對一單人聊天案例

源碼下載(實例四):

jsp開發簡單聊天室demo-分享

3.實現通訊錄

java通訊錄實現了添加刪除和查找功能

源碼下載(二):

JAVA版通訊錄管理系統課程設計源碼

源碼下載(三):

Java Swing界面.完美設計通訊錄..有需要的下

4.坦克大戰

源碼下載(一):

俄羅斯方塊 JAVA版

源碼下載(二):

GitHub - FieldSoft-HelloClyde/Tetris-Swing: Swing編寫的俄羅斯方塊

源碼下載(三):

java swing開發的俄羅斯方塊游戲,包含完整代碼+詳細注釋

5.五子棋

源碼下載(一):

Java實踐(十一)——五子棋

源碼下載(二):

java swing開發的五子棋小游戲源碼

源碼下載(三):

java swing開發單機版五子棋源代碼下載

源碼下載(四):

Java五子棋演算法和代碼

6.中國象棋

源碼下載(一):Java實踐(十二)——中國象棋

7.貪吃蛇

java貪吃蛇源代碼 、 java貪吃蛇源代碼

以上是總結出來的簡單的練手項目,希望對你有幫助

㈥ 關於java如何做web應用程序開發,並給出一個的簡單的例子

你好。學習web需要准備的:
1、堅實的java基礎
2、tomcat伺服器
3、一定的html+css+javascript知識
4、servlet+jsp知識
5、模式1和模式2開發
把上面的都學好了,就可以做一個簡單的開發了。一個項目的代碼比較長,貼出來也沒有任何意義,如果樓主沒有上面的知識,有代碼也不能運行。所以建議你還是先學,慢慢練,很快就接觸到例子了。

㈦ 《JavaWeb開發實戰1200例(第Ⅱ卷)》epub下載在線閱讀,求百度網盤雲資源

《Java Web開發實戰1200例(第Ⅰ卷)》(盧瀚//王春斌)電子書網盤下載免費在線閱讀

資源鏈接:

鏈接:https://pan..com/s/1q3rJnu2DKZqZmHcr6Zl1Wg

密碼:m01y

書名:Java Web開發實戰1200例(第Ⅰ卷)

作者:盧瀚//王春斌

出版社:清華大學

出版年份:2011-1

頁數:909

內容簡介:

《Java Web開發實戰1200例(第1卷)》簡介:《Java Web開發實戰1200例》包括第I卷、第II卷共計1200個例子,《Java Web開發實戰1200例(第1卷)》是第I卷,共計600個例子。

《Java Web開發實戰1200例(第1卷)》以開發人員在項目開發中經常遇到的問題和必須掌握的技術為中心,介紹了應用Java Web進行程序開發的各個方面的知識和技巧,主要包括Java Web編程基礎、文件操作管理、圖形圖像與多媒體技術、窗體應用技術、JSP操作Word與Excel等。全書分6篇23章,共計600個實例和600個經驗技巧。每個實例都是經過作者精心篩選的,具有很強的實用性,其中一些實例是開發人員難於尋覓的解決方案。

《Java Web開發實戰1200例》兩卷共計1200個例子,包括了開發中各個方面最常用的實例,是目前市場上實例最全面的開發類圖書;本書實例來源於多位工程師的多年積累,具有很強的實用性。

《Java Web開發實戰1200例(第1卷)》附帶有配套DVD光碟,光碟中提供有部分實例的視頻和大部分源代碼,讀者稍加修改即可應用。

《Java Web開發實戰1200例(第1卷)》適合Java Web的初學者,如高校學生、求職人員作為練習、速查、學習使用,也適合Java Web程序員參考、查閱。

㈧ java能開發一個電商應用嗎

當然可以,像阿里、京東都是用java開發的。現在java培訓機構的畢業項目一般都是電商,就是到快學完的時候,都會開發一個電商項目的。

㈨ 用JAVA製作一個小程序,計算兩個數的加減乘除,用Applet實現

下面兩個可以么,是我做實驗答辯時用到的!

import java.awt.*;//AWT核心包
import java.awt.event.*;//提供事件類和監聽器
public class Counter extends Frame implements ActionListener
{
TextField t=new TextField("");//文本框
Panel p1=new Panel();//new一個panel,用於存放數字鍵和符號鍵。
Panel p2=new Panel();//new一個panel,用於存放開方、平方、和清除鍵。
Button[] b=new Button[10];//實例化Button對象
Button bAdd=new Button("加");
Button bSub=new Button("減");
Button bMul=new Button("乘以");
Button bPoint=new Button(".");
Button bDiv=new Button("除以");
Button bEqual=new Button("等於");
Button bSqrt=new Button("開方");
Button bPow=new Button("平方");
Button bNull=new Button("清除");

String str1=""; //str1和str2存放兩個輸入的數
String str2="";
String operator=null; //存放加減乘除以及開平方的符號
boolean first=true; //檢驗輸入的是否為第一個數
int countOper=0; //累計輸入符號的個數,連加連減等操作中會用到
double result=0.0; //暫存結果
double num1=0.0,num2=0.0; //兩個輸入的數做運算時轉化為double存放
boolean error=false; //檢驗除數是否為0

//構造方法
public Counter()
{
Frame s=new Frame("計算器");//創建Frame

for(int i=0;i<10;i++)//利用for循環將數字鍵添加進p1中
{
b[i]=new Button(String.valueOf(i));
p1.add(b[i]);
b[i].setActionCommand("number");
b[i].setForeground(new Color(150,20,20));
b[i].addActionListener(this);//調用addActionListener()方法注冊事件監聽器
}
p1.add(bPoint);
bPoint.setActionCommand("number");
p1.add(bAdd); //數字鍵,符號鍵放置在panel的p1中
p1.add(bSub);
p1.add(bMul);
p1.add(bDiv);
p1.add(bEqual);
p2.add(bSqrt);//開方鍵,平方鍵,清除鍵放置在panel的p2中
p2.add(bPow);
p2.add(bNull);
bAdd.setActionCommand("oper");
bSub.setActionCommand("oper");
bMul.setActionCommand("oper");
bDiv.setActionCommand("oper");

bAdd.setForeground(Color.red);//為組鍵設計顏色
bSub.setForeground(Color.red);
bMul.setForeground(Color.red);
bDiv.setForeground(Color.red);
bPoint.setForeground(Color.black);
bEqual.setForeground(Color.red);
bSqrt.setForeground(Color.blue);
bPow.setForeground(Color.blue);
bNull.setForeground(Color.blue);

bAdd.addActionListener(this);//調用addActionListener()方法注冊事件監聽器
bSub.addActionListener(this);
bMul.addActionListener(this);
bDiv.addActionListener(this);
bPoint.addActionListener(this);
bEqual.addActionListener(this);
bSqrt.addActionListener(this);
bPow.addActionListener(this);
bNull.addActionListener(this);

p1.setLayout(new GridLayout(4,4,5,5));//網格布局管理器,把容器根據行數和列數分成同樣大小的單元,
//每個單元可容納一個組件,並且此組件會填滿網格單元,不能控
//制其占據網格的大小。4、4為網格的行、列數。5、5為組建之間的
//間距
p2.setLayout(new FlowLayout());//用FlowLayout布局管理器將組建默認劇中排放,默認間隙為5個像素
add(t,"North"); //frame的north放置輸入框,panel放置在center和south
add(p1,"Center");//將p1添加到Center中
add(p2,"South");//將p2添加到South中
setLocation(400,200);//設計按鈕尺寸
setSize(200,200);//設計窗口尺寸
setBackground(new Color(20,200,10));//設置Frame的背景,默認為白色
setVisible(true);//設置Frame設置為可見

addWindowListener(new WindowAdapter(){ //關閉窗口功能
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}

//實現介面ActionListener
public void actionPerformed(ActionEvent e)
{
Button temp=(Button)e.getSource();

if(e.getActionCommand().equals("number"))
{
if(first)
{
str1=str1+temp.getLabel();
t.setText(str1);//將輸入的str1顯示在文本框中
}
else
{
str2=str2+temp.getLabel();
t.setText(str2);//將輸入的str2顯示在文本框中
}
}

else if(e.getActionCommand().equals("oper"))
{
if(str1=="") //如果還沒有輸入數就點擊運算符執行if
{
countOper=0;//若此,則將計數清零
first=true;
}
else
{
countOper++;//計算輸入符號的個數
if(countOper>1)//若輸入的符號個數多餘一個,則可以進行計算
{
getResult();
}
operator=temp.getLabel();//存放加減乘除以及開方、平方的符號
first=false;
}
}

else if(e.getActionCommand().equals("開方"))
{
double d=Math.sqrt(Double.parseDouble(str1));
str1=String.valueOf(d);//將計算出來的結果再次傳給str1,為連計算準備
t.setText(String.valueOf(d));//將計算出來的結果傳至文本框中
first=false;//置為false,即已輸入第一個數
}

else if(e.getActionCommand().equals("平方"))
{
double f=Math.pow(Double.parseDouble(str1),2);
str1=String.valueOf(f);
t.setText(String.valueOf(f));
first=false;
}

else if(e.getActionCommand().equals("清除"))
{
str1="";//清空
str2="";
t.setText("");//將文本框清空
countOper=0;//將按鍵計數器清零
first=true;
error=false;
}
else if(e.getActionCommand().equals("等於"))
{
if((str1=="")||(str2=="")) //兩個數沒有輸全就點擊等號,執行if
{
countOper=0;//將按鍵計數器清零
first=true;
}
else
{
getResult();
countOper=0;
}
}
}

//運算結果的方法
public void getResult()
{
num1=Double.parseDouble(str1);
num2=Double.parseDouble(str2);

if(operator.equals("加"))
{
result=num1+num2;
}

else if(operator.equals("減"))
{
result=num1-num2;
}

else if(operator.equals("乘以"))
{
result=num1*num2;
}

else if(operator.equals("除以"))
{
if(num2==0.0) //除數為0的處理方法
{
error=true;
}
else
{
result=num1/num2;
}
}

if(error)
{
t.setText("error");
}
else
{
t.setText(String.valueOf(result));
str1=String.valueOf(result); //運算後把結果放入str1中,str2清空,為連加連減等操作做准備
str2="";
}
}

//主方法
public static void main(String[] args)
{
new Counter();//創建一個對象"計算器"
}
}

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class CalculatorPanel extends JPanel
implements ActionListener
{ public CalculatorPanel()
{ setLayout(new BorderLayout());

display = new JTextField("0");
display.setEditable(false);
add(display, "North");

JPanel p = new JPanel();
p.setLayout(new GridLayout(4, 4));
String buttons = "789/456*123-0.=+";
for (int i = 0; i < buttons.length(); i++)
addButton(p, buttons.substring(i, i + 1));
add(p, "Center");
}

private void addButton(Container c, String s)
{ JButton b = new JButton(s);
c.add(b);
b.addActionListener(this);
}

public void actionPerformed(ActionEvent evt)
{ String s = evt.getActionCommand();
if ('0' <= s.charAt(0) && s.charAt(0) <= '9'
|| s.equals("."))
{ if (start) display.setText(s);
else display.setText(display.getText() + s);
start = false;
}
else
{ if (start)
{ if (s.equals("-"))

else op = s;
}
else
{ calculate(Double.parseDouble(display.getText()));
op = s;
start = true;
}
}
}

public void calculate(double n)
{ if (op.equals("+")) arg += n;
else if (op.equals("-")) arg -= n;
else if (op.equals("*")) arg *= n;
else if (op.equals("/")) arg /= n;
else if (op.equals("=")) arg = n;
display.setText("" + arg);
}

private JTextField display;
private double arg = 0;
private String op = "=";
private boolean start = true;
}

public class CalculatorApplet extends JApplet
{ public void init()
{ Container contentPane = getContentPane();
contentPane.add(new CalculatorPanel());
}
}

㈩ java寫的用戶登陸實例,用eclipse開發的具體步奏和代碼

java寫的用戶登錄實例,實際頁面展示使用的jsp,那麼下面是jsp的登錄頁面代碼:
1、login.jsp代碼
<%
string name = request.getparameter("username");
string pwd = request.getparameter("password");
//out.println(name+pwd);
string sql ="select * from info where username='"+name+"' and password='"+pwd+"'";
//out.println(sql);
statement stm= null;
resultset rs =null;
try
{
stm = conn.createstatement();
rs = stm.executequery(sql);
if(rs.next())
{
session.setattribute("username",name);
response.sendredirect("index.html");
}
else
{
response.sendredirect("index1.html");
}
}
catch(sqlexception e)
{
e.printstacktrace();
}
%>
<!--登錄的表單-->
<form name="form1" method="post" action="login.jsp">
<p>
<label for="username"></label> 用戶名
<input type="text" name="username" id="username">
</p>
<p>
<label for="passwrod"></label> 密碼
<input type="text" name="passwrod" id="passwrod">
</p>
<p>
<input type="submit" name="button" id="button" value="提交">
</p>
</form>
2、用戶信息表,存放用戶名和密碼:
user_info 表
create table if not exists `test` (
`id` int(8) not null auto_increment,
`username` char(150) default null,
`password` varchar(32),
`times` int(4) not null,
primary key (`id`)
) engine=myisam default charset=utf8 auto_increment=1 ;

熱點內容
安卓手機高刷在哪裡 發布:2025-07-02 10:43:02 瀏覽:342
愛奇藝iphone緩存 發布:2025-07-02 10:38:00 瀏覽:841
南方次元的解壓 發布:2025-07-02 10:31:32 瀏覽:246
葉祖新編程 發布:2025-07-02 10:29:06 瀏覽:400
k4在哪裡下載安卓 發布:2025-07-02 10:15:32 瀏覽:909
魔獸腳本破解版 發布:2025-07-02 10:15:30 瀏覽:995
鋒雲7800伺服器無網路怎麼辦 發布:2025-07-02 10:03:53 瀏覽:1000
安卓哪個版本可以安裝sd卡 發布:2025-07-02 09:58:09 瀏覽:984
存儲包下行流量包 發布:2025-07-02 09:49:00 瀏覽:364
固態主控演算法 發布:2025-07-02 09:38:27 瀏覽:12