java部分設計模式
阿新 • • 發佈:2018-11-19
/* 單例設計模式 思想: 1.不讓其他程式建立該類物件。 2.在本類中建立一個本類物件。 3.對外提供方法,讓其他程式獲取這個物件。 程式碼體現: 1.私有化構造方法,目的是讓其他程式無法建立該類物件。 2.建立私有並靜態的本類方法。 3.定義共有並靜態的方法,返回該類物件。 解決的問題:保證一個類在記憶體中的物件唯一性。 */ class Single { //單例設計模式:餓漢式 private Single(){} private static Single s=new Single(); public static Single getInstance(){return s; } } class Single2 {// 單例設計模式:懶漢式,延遲載入方法 private Single2(){} private static Single2 s2=null; public static Single2 getInstance(){ if(s2==null) s2=new Single2(); return s2; } }
/* 模板方法設計模式 解決的問題:當功能內部一部分實現確實,一部分實現不確定。這時可以把不確定的部分暴露出去,讓子類去實現。*/ abstract class GetTime{ public final void getTime(){ long start = System.currentTimeMillis(); code();//將不確定的部分,提取出來,通過抽象方法實現。 long end = System.currentTimeMillis(); System.out.println("毫秒是"+(end-start)); } public abstract void code();//抽象不確定的功能,讓子類複寫實現。 } classSubDemo extends GetTime{ public void code(){//子類複寫功能方法 for(int i=0;i<1000;i++){ System.out.println(i); } } }
/* 裝飾設計模式 解決的問題:對一組物件的功能進行增強時,就可以使用該模式進行問題的解決。 特點:裝飾類和被裝飾類都必須所屬於同一個介面或者父類。 例 1: class Person{ public void Eat(){ System.out.println("吃飯"); } } class NewPerson{ private Person p; public void Eat(Person p){ System.out.println("開胃酒"); p.Eat(); System.out.println("甜點"); } } 裝飾和繼承都能實現一樣的特點: 進行功能的拓展增強。 有什麼區別呢? 例 2:首先有一個繼承體系: Writer |--TextWriter:用於操作文字 |--MediaWriter:用於操作媒體 想要對操作的動作進行效率的提高。 按照面向物件,可以通過繼承對具體的進行功能的擴充套件。 效率提高需要加入緩衝技術。 Writer |--TextWriter:用於操作文字 |--BufferTextWriter:加入緩衝技術的操作文字物件。 |--MediaWriter:用於操作媒體 |--BufferMediaWriter:加入緩衝技術的操作媒體物件。 到這裡就可以了,但是這樣做好像並不理想。 如果這個體系進行功能拓展,又多了流物件。 那麼這個流要提高效率,是不是也要產生子類呢?
是,這是就會發現只為提高功能,進行的繼承,導致繼承體系越來越臃腫。不夠靈活。
重新思考問題? 既然加入的都是同一種技術--緩衝 前一種是讓緩衝和具體的物件相結合。 可不可以將緩衝進行單獨的封裝。那個物件需要緩衝就將那個物件和緩衝關聯。 class Buffer extends Writer{ BufferWriter(Writer w){} } Writer |--TextWriter:用於操作文字 |--MediaWriter:用於操作媒體 |--BufferWriter:用於提高效率 裝飾要比繼承靈活。 */ class Person{ public void Eat(){ System.out.println("吃飯"); } } class NewPerson{ private Person p; public void Eat(Person p){ System.out.println("開胃酒"); p.Eat(); System.out.println("甜點"); } }