??xml version="1.0" encoding="utf-8" standalone="yes"?>精品国内亚洲2022精品成人,亚洲网站免费,成人在线视频一区http://www.aygfsteel.com/sharky77/蓦然回首Q那人却在灯火阑珊处zh-cnSat, 17 May 2025 15:03:33 GMTSat, 17 May 2025 15:03:33 GMT60- 亲密接触设计模式(?-------Iterator(q代?http://www.aygfsteel.com/sharky77/archive/2007/07/27/132468.html回归回归Fri, 27 Jul 2007 07:22:00 GMThttp://www.aygfsteel.com/sharky77/archive/2007/07/27/132468.htmlhttp://www.aygfsteel.com/sharky77/comments/132468.htmlhttp://www.aygfsteel.com/sharky77/archive/2007/07/27/132468.html#Feedback2http://www.aygfsteel.com/sharky77/comments/commentRss/132468.htmlhttp://www.aygfsteel.com/sharky77/services/trackbacks/132468.html
前些時工作忙Q中間停頓一D|間,今天J續。向關注這里的文章的博友們表C抱歉?br> 今天說說一個簡單的模式QP代器模式(Iterator),他屬于行為模式中的一E?br>
[形成]
在JavaE序中,在出List型的對象時候,出現最多的E式塊就是:
1 for (int i = 0 ;i<list.size; i++){
2 XXX x = (XXX)list.get(i);
3 }
其中list 是List 型Q里邊放著若q個XXX型的對象?br>這種 方式是采用i++遞增的方式來遍歷list中的所有對象來進行盔R操作。對于設a模式,把i的功能抽象劃的結果就是:Iterator Pattern
Iterate 中文的意思是“q代Q反?#8221;QIterator 的意思可以理解為“q代?#8221;?br>
[代码CZ]
CZE式是把?Book)攑ֈ書架?BookShelf)上,q依ơ出書名?br>
E式列表
名稱 |
說明 |
Aggregate |
表示已聚合的接口 |
Iterator |
埯遞增Q遍L接口 |
Book |
表示書籍的類 |
BookShelf |
表示書架的類 |
BookShelfIterator |
掃描書架的類 |
Main |
測試用的?/td>
|
[UML图]

[CZ代码和类的诠释]
1 package Iterator;
2
3 import java.util.Iterator;
4
5 public interface Aggregate {
6 public abstract Iterator iterator();
7 }
8
Aggregate 接口Q?br> 該接口只聲明了一個方法,建立一個可以對應聚合的Iterator.,畉要遍h個聚合對象時Q調用IteratorҎ可以建立一個實現Iterator接口的類的對象實例?br>
1 package Iterator;
2
3 public interface Iterator {
4 public abstract boolean hasNext();
5 public abstract Object next();
6 }
7
Iterator 接口Q?br>這是該模式的核心接口QIterator接口埯元素的遞增,h循環遍歷的功能。Iterator的接口的Ҏ因需要而定Q我們可以初步確定接口方?
hasNext() Q是檢查有沒?#8220;下一個元?#8221;Q返回boolean.Q有Q返回true,,無,q回false)
next();取得“下一個元?#8221;Q同時把取對象的指針指向下一個元素,以便下次調用nextҎ的時候確實能取到下一個元素。這些具體實現還得看具體的實現Iterator接口的類的實現才知道
1 package Iterator;
2
3 public class Book {
4 private String name = "";
5
6 public Book(String name) {
7 this.name = name;
8 }
9
10 public String getName() {
11 return name;
12 }
13 }
14
Book :
表示書籍的類Q比較簡單,通過getNameҎ得到書的名字Q書名是以構造函數初始化象的時候用參數來字號定?br>
1 package Iterator;
2
3 public class BookShelf implements Aggregate{
4 private Book[] books;
5 private int last = 0;
6
7 public BookShelf(int maxsize){
8 this.books = new Book[maxsize];
9 }
10
11 public Book getBookAt(int index){
12 return books[index];
13 }
14 public void appendBook(Book book){
15 this.books[last] = book;
16 last++;
17 }
18
19 public int getLength(){
20 return last;
21 }
22 public Iterator iterator(){
23 return new BookShelfIterator(this);
24 }
25 }
26
BookShelfl:
該類是表現書架作用的,保證實現Aggregate接口所聲明的IteratorҎ里返回實現Iterator接口的實例。如果需要遍h架上的書Q調用iteratorҎ。books數組存放的對象就是book,書架大小可以在一開始建立時設|大,當然我們可以不用數i而采用java.util.Vector,可以往書架上放過指定敔R的書c?br>
1 package Iterator;
2
3 public class BookShelfIterator implements Iterator{
4 private BookShelf bookShelf;
5 private int index;
6 public BookShelfIterator(BookShelf bookShelf){
7 this.bookShelf = bookShelf;
8 this.index =0;
9 }
10
11 public boolean hasNext(){
12 if(index < bookShelf.getLength()){
13 return true;
14 }else{
15 return false;
16 }
17 }
18
19 public Object next(){
20 Book book = bookShelf.getBookAt(index);
21 index++;
22 return book;
23 }
24
25 }
26
BookShelfIterator:
字段bookShelf指定BookShelfIterator所要掃描的書架Q而index字段則是指向目前該書的下標?br> 構造函數把傳過來的BookShelf象實例儲存在bookShelf字段Q將indexa置?.
實現的hasNextҎ判斷是否有下一本書的標準是Ҏindex是否于書架上書c的敔RQ表達式bookShelf.getLength()的?來判斗?br> nextҎq回目前該書Qƈ進入?#8220;下一?#8221;。兩步:W一步先把取得當面的書籍保留在book變量Q然后把循環變量推到“下一?#8221;?br>
1 package Iterator;
2
3 public class Main {
4 /**
5 * @param args
6 */
7 public static void main(String[] args) {
8 BookShelf bookShelf = new BookShelf(3);
9 bookShelf.appendBook(new Book("book1"));
10 bookShelf.appendBook(new Book("book2"));
11 bookShelf.appendBook(new Book("book3"));
12 Iterator it = bookShelf.iterator();
13 while(it.hasNext()){
14 Book book = (Book)it.next();
15 System.out.println(" "+book.getName());
16 }
17 }
18
19 }
20
Main:
1.先放三本怸?br> 2.通過調用書架的iteratorҎ得到q代器,來進行循環遍歷
3.循環遍歷書籍Q取出書Q打印出書的名字?br>
回顧一下,在P代器模式中幾個重?#8220;角色”Q?br> q代? 定義了訪問和遍歷元素的接?Q它定義了能否取得下一個元素信息的的hasNextҎ和取得下一個元素的nextҎ
具體的P代器Q實現了q代器的接口Q如本例的BookShelfIteratorQ掌握遍h的重要信息?br> 聚合Q定了建立了Iterator的接口。如本例的:Aggregate接口Q定了IteratorҎ
具體聚合Q實現了聚合的所定義的接口,如本例的BookShelfQ它實現了IteratorҎ?br>
[拓展思考]
有h回想Q干嘛搞這么ȝQ用一個for不就是可以遍hi或List|思考一下P代器的結構。Iterator是把定義和實珑ֈ?br>
while(it.hasNext()){
Book book = (Book)it.next();
System.out.println(" "+book.getName());
}
這里我只調用了Iterator接口的hasNext和nextҎQƈ沒有調用BookShelf實現遍歷是需要的ҎQ如:getBookAt()。這里的while不會收到BookShelf的實珑֪ѝ?br> 假設這里我們不采用數組來管理BookShelfQ而采取與Java.util.Vector來管理。無論BookShelf的如何修改,都Main測試E序里無需修改ME序可以運行,這就是設a模式的優勢。設a模式是Z提高的服用率,如果把一個零件修改了Q就不想要修改其他用了攚w件的部分?br>

]]>- 亲密接触设计模式(?-------Singleton(单例)http://www.aygfsteel.com/sharky77/archive/2007/06/08/122780.html回归回归Fri, 08 Jun 2007 03:36:00 GMThttp://www.aygfsteel.com/sharky77/archive/2007/06/08/122780.htmlhttp://www.aygfsteel.com/sharky77/comments/122780.htmlhttp://www.aygfsteel.com/sharky77/archive/2007/06/08/122780.html#Feedback7http://www.aygfsteel.com/sharky77/comments/commentRss/122780.htmlhttp://www.aygfsteel.com/sharky77/services/trackbacks/122780.html
[形成]
Singleton Pattern Z么会出现?在我们Y件开发和架构?l常遇到q样的情?我们需要一个类只能且仅能生一个实?.比如表示一台计机的类,表示pȝ讑֮的类或者是表示H口的类,q有Z节约资源,只让产生一个实?.
如何构造这U情?Singleton模式l我一个方?
[代码CZ]
E序列表
名称
|
说明
|
Singleton
|
只有一个对象实例的c?/p>
|
Main
|
试用的c?/p>
|
[UML图]

[CZ代码和类的诠释]
1 package singleton;
2
3 public class Singleton {
4 private static Singleton singleton = new Singleton();
5
6 private Singleton() {
7 System.out.println("Create instance...");
8 }
9
10 public static Singleton getInstance() {
11 return singleton;
12 }
13 }
14
Singleton Class:
1.该类只能产生一个对象实?br />
2.把该cȝ的singleton属性设定ؓstatic再以Singleton;cȝ对象实例q行初始?q个初始化的q程仅加载Singtoncȝ时候调用一?(Line4)
3.把Singleton cȝ构造函数限定ؓprivate,目的是ؓ了防止从非Singletonc?其他c?调用构造函数来产生实例,如果通过new方式来生Singleton实例,会出现编译错?q样做是Z保险p.(Line6)
4.要得到Singleton实例的唯一Ҏ是调用c静态方法getInstance().q个名字可以随便?只要方便理解p.(Line 10)
1 package singleton;
2
3 public class Main {
4
5 public static void main(String[] args) {
6 System.out.println("Start");
7 Singleton obj1 = Singleton.getInstance();
8 Singleton obj2 = Singleton.getInstance();
9 if(obj1 == obj2){
10 System.out.println("obj1和obj2是同一個對象實?/span>");
11 }else{
12 System.out.println("obj1和obj2不是同一個對象實?/span>");
13 }
14 System.out.println("End");
15 }
16 }
17
Main Class
1.该类是测试程?
2.E序通过getInstance()方式产生两个obj1和obj2实例.(Line 7,Line 8)
3.通过ojb1= =ojb2表达式来定两个对象是否相同,判定是否产生了Singleton的第二个CZ.(Line9-12)
执行l果含义:
1. 的确如此,obj1和obj2是Singletoncȝ同一个且唯一的对象实?
2.当程序执行后,W一ơ调用getInstance的时候会初始化Singletonc?同时也会初始化static字段,也同时生生了一个唯一对象实例.
[拓展思考]
如下的另一一个单例模式的E序有什么隐?
1 package singleton;
2
3 public class Singleton2 {
4
5 private static Singleton2 singleton = null;
6
7 private Singleton2(){
8 System.out.println("已產生對象實?/span>");
9 }
10 public static Singleton2 getInstance(){
11 if(singleton == null){
12 singleton = new Singleton2();
13 }
14 return singleton;
15 }
16
17 }
18
[解答]
当多U程同时调用Singleton2.getInstance()ҎӞ可能会生多个对象实例,例如

public class Main extends Thread
{


public static void main(String[] args)
{
System.out.println("Starts.");
new Main("A").start();
new Main("B").start();
new Main("C").start();
System.out.println("End.");
}

public void run()
{
Singleton2 obj = Singleton2.getInstance();
System.out.println(getName()+": obj ="+obj);
}

public Main(String name)
{
super(name);
}
}


public class Singleton2
{
private static Singleton2 singleton2 = null;

private Singleton2()
{
System.out.println("已生对象实?/span>");
solwDown();
}


public static Singleton2 getInstance()
{

if(singleton2 == null)
{
singleton2 = new Singleton2();
}
return singleton2;
}

private void solwDown()
{

try
{
Thread.sleep(1000);

}catch(InterruptedException e)
{
e.printStackTrace();
}
}
}

执行l果Q?br />
Start.
End.
已生对象实?
已生对象实?
已生对象实?
B: obj = Singleton2#2a9348
C: obj = Singleton2#b91134
A: obj = Singleton2#e343l12
Q?替换为@Q?br />
之所以会知道q种情况是因为if(singleton = = null){ singleton = new Singleton2(); }判断不够严}的导致?br />
利用: singleton == null 判断为空后去执行new Singleton2()之前Q可能会有其他线E来抢先判断表达式singleton == nullQ从而又执行一遍创建实例的操作?br />
解决办法Q?br />
lgetInstance()ҎdSynchronized修饰W,卛_修改成线E安全严谨的单例模式?br />
public class Singleton2 {
private static Singleton2 singleton = null;
private Singleton2() {
System.out.println("已生对象实?/span>");
solwDown();
}
public static synchronized Singleton2 getInstance() {
if (singleton == null) {
singleton = new Singleton2();
}
return singleton;
}
private void solwDown() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

]]> - 亲密接触设计模式(一)----UML基础(修订增补?http://www.aygfsteel.com/sharky77/archive/2007/06/08/122199.html回归回归Fri, 08 Jun 2007 01:53:00 GMThttp://www.aygfsteel.com/sharky77/archive/2007/06/08/122199.htmlhttp://www.aygfsteel.com/sharky77/comments/122199.htmlhttp://www.aygfsteel.com/sharky77/archive/2007/06/08/122199.html#Feedback0http://www.aygfsteel.com/sharky77/comments/commentRss/122199.htmlhttp://www.aygfsteel.com/sharky77/services/trackbacks/122199.html [UML漫谈]
话说"工欲善其工需利其?,有了好的工具,好的表达方式,能给我们的工作变得简单而优?
Z更好的讲解设计模?方便理解,需要运用一U徏模设计语a----UML.
UML(UML:Unified Modeling Language),即统一建模语言,用来对Y件密集系l进行描q、构造、视化和文档~制的一U语a.q是概念,不好理解.
UML的作?打个比方:一D|写迷人v滩风景的文字和一q描lv滩风景的油画,ȝq两件东西的?有的人可能能L文字(可能是特定的语言),有的不认?所以ƈ不是所有的看懂文字表达的内?但是所有的人都能读懂aL表现出来的含?油画表达内容的直?形象,丰富Ҏ就cdUML在描叙Y件结构过E中的作?
在Y仉目中,一般有几个角色:用户(User),架构设计?orPM, SA),E序?PG)
用户:
也许不懂计算?也不懂编E语a,但是懂行业业?该Y件的功能需?
E序?br />
懂计技?懂编E语a.但是不太了解行业逻辑.需要把客户的业务应用需求{变ؓE序代码,
架构设计?br />
资深的行业架构设计师应该h一定的行业知识,既能听懂客户的业务需?又能知道怎么告诉E序员去用代码实?
架构设计师在前两者交中起到承前启后?中间?作用.UML是采用囑Ş化的形式来表达架构和设计.成ؓ了徏模设计的通用的设计标?.

UML图让信息交流变得?br />
[UML基础]
此处只介l帮助理解设计模式的UML基础,具体其他的UML囄需要参考具体的讲解UML的书c?
1.cȝ层关系
UML中的cd是一U可表示一l类,对象实例和接口之间的静态关pd.



如图的UMLcd表达了上面代码的含义,
cM间的关系有四U?依赖,泛化,实现聚集,l成.具体的UML实例可以参UML基础.
2.接口和实?br />
实现接口的UMLCZ如下:

interface Printable {
abstract void print();
}
public class PrintClass implements Printable {
public void print() {
// how to print
}
}
接口,抽象,实现,l承在设计模式中被广泛的使用,q也是OOD的优势所?妙所?
q里只DZ几个单情?让大家有个感性的了解,具体的情形在说具体的设计模式的时候在针对性的说明,先不用弄那么?那么?能开始下一步就_.
cM间的关系
cM间的关系?U,兌 依赖 聚集 泛化 实现

]]> - 亲密接触设计模式(?http://www.aygfsteel.com/sharky77/archive/2007/06/05/122079.html回归回归Tue, 05 Jun 2007 03:30:00 GMThttp://www.aygfsteel.com/sharky77/archive/2007/06/05/122079.htmlhttp://www.aygfsteel.com/sharky77/comments/122079.htmlhttp://www.aygfsteel.com/sharky77/archive/2007/06/05/122079.html#Feedback3http://www.aygfsteel.com/sharky77/comments/commentRss/122079.htmlhttp://www.aygfsteel.com/sharky77/services/trackbacks/122079.html 原创作?阉K
日期:2007-06-05
首先说说写这pd的文章的xQ目的在?
1.自己也在研习设计模式,通过在自我ȝ的过E中,希望能多设计模式多一Ҏȝ?br> 2.希望l看到这pd文章的朋友一点对设计模式学习的帮?特别是对设计模式的初学者能起到"引进?的效?
如果以上的作用能起到哪怕一?我也ƣ闻而笑?
设计模式(Design Patterns)是什?Z么会出现设计模式?做过开发项目的朋友可能都遇到过,一个问题会在一个项目或者多个项目中重复出现,而相应的解决Ҏ都是cM相同,相应代码的实C是大同小?Z么我们不能复用这些解x?或者说我们是否能修Ҏ重新构徏一下设计架构来使得重复的代码更?l构更合? 当然,q些是可行且有必要的. 此时设计模式的出现让我们茅舍开.
说到设计模式,不得谈一本书<Design Patterns:Element of Resuable Object-Oriented Software),作者是GoF,实际是三个h合著?之所以提到这本书,因ؓq本书的l典在于详细阐述?3U在软g开发过E中q用q泛?模式",q一个理늚提出,l面向对象设?OOD)注入了新的血?体现出OOD越面向q程设计的优势所?从此让程序员看待代码有了"哲学的眼?..
像q本书定义的模式:每个模式描述了一个在我们周围不断重复和发生的问题,以及该问题解x案的核心,q样你就能一ơ又一ơ用该Ҏ而不必做重复力_.
x,设计模式的意义已l凸?设计模式l我们的启发又是什?的确,每个l典的设计模式体现出了大师的_湛思想,我们需要从中得到的启发是能?举一反三",在我们每一ơ的软g设计和开发中融入q些l典模式,让Y件设计得更易理解,更易拓展,更易l护.q是设计模式l后人的最大启C?
l典的设计模式我的启示应该是個思想,而不是固定的那幾個模?具体的Y仉目或软g产品,會有不同情Ş,我们应该依据具体的情況合理运用模式思想,设计模式只是"招式"套\,要做?无招胜有?,需要具体的情Ş分析,q一定要套用所谓的模式,但是原则是不变的,"让Y件易理解,易拓?易维?.
把语aҎ和设计模式有机l合h,对于E序员来说是一个成长的标志点也是{折点,希望此文能对所有程序员有所帮助.
用心d文章是g不容易的事情,需要坚持和执著,既然开?应该坚持到?.
q个pd的文章主要是从GoF的归U的23U设计中挑选十来个在Y仉目中常用和运用的设计q行讲叙,讲叙风格应该是简?深入出,思\和代码相l合.
该系列文章要讲述的几个经典设计模?(暂定)
实现语言采用Java,是设计模式让OOD成ؓ软g开发历史上的光辉更加绚?
有h?开始L好的.所?赶紧开始把.

]]>
վ֩ģ壺
ƽ|
罭|
ׯ|
|
ѧ|
|
Ȫ|
|
|
|
|
|
|
|
˼|
|
Ѩ|
|
崲|
IJ|
ƽ|
ɽ|
ͨ|
|
ԭ|
˫|
|
²|
|
ʯɽ|
ƽ|
ְ|
|
½|
|
ƽ|
ʩ|
̩|
|
|
|