1. 程式人生 > >java部分設計模式

java部分設計模式

/*
單例設計模式
 思想:
  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();//抽象不確定的功能,讓子類複寫實現。 } class
SubDemo 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("甜點"); } }