有這麼一家廠家,做披薩和玩具車兩種product,並且給他們的產品裝在不同的包裝盒box裡,我們通過委託的方式給他們的產品裝上包裝盒。
產品類
class product
}
class box
}
包裝車間類
這裡多說一句,包裝車間類裡有包裝產品方法warpproduct(),這個方法的引數是委託型別的變數getporduct,
意味著我們要先例項化委託(用委託變數「引用」這個例項)再傳入這個委託型別的變數
class warpfactory
}
這個委託的返回型別是product,則返回型別是product型別的物件
產品工廠類
class productfactory
public product maketoycar()
}
主函式類class program
}
先建立funcpizza 委託,封裝了makepizza這個方法,
warpproduct類的warpproduct方法中
product product = getporduct.invoke();
呼叫了funcpizza委託,
就跳轉到productfactory類中makepizza這個方法裡(間接呼叫)
makepizza方法建立了乙個product型別的pizza物件
呼叫完成後會返回間接呼叫的起點處
product product = getporduct.invoke();
並且通過委託拿到乙個product型別的物件(pizza),並且
box.product = product;
這個物件(pizza)就傳入了box物件,在主函式中這個box又被賦值給對應的box型別物件(如box類的pizzabox例項)
就完成了對產品的包裝。
結果:
這就是我們的模板方法,
邏輯在上面已經說明。
可以修改的邏輯是委託的呼叫getporduct.invoke(),傳進來的委託封裝的什麼方法,在這裡可以得到這個方法產出的產品。
這樣寫的好處是,我們只需要擴充套件產品類,而不需要動其他任何地方,最大限度的實現了**的重複使用。
**方法是通過委託型別的引數傳進主呼叫方法的乙個被調入方法,
主呼叫方法可以根據自己的邏輯來決定呼叫還是不呼叫這個方法。
又叫好萊塢方法:主辦方讓面試的求職者回去等**。
總結一下就是:方法作為引數,一定條件觸發後,呼叫這個方法
舉例說明:
我們先對我們之前的產品類進行改造,加入price屬性。
產品類
class product
public double price
}
然後新增乙個logger類,來記錄執行狀態,log方法來記錄狀態沒有返回值,這裡記錄的是建立時間
logger類
class logger
',created at .",product.name, datetime.utcnow, product.price);有時區}}
我們把log方法,以**方法的形式傳入我們的模板方法裡,
對於沒有返回值的方法(log),我們用action委託。
action委託可以接收型別引數。
當產品**》50的時候我們就呼叫log方法。
包裝車間類
class warpfactory
return box;}}
action這個委託沒有返回值,
要求委託的方法必須是無返回值void,引數型別必須是product
因此寫成logcallback.invoke(product);logger類的log()的確沒有返回值,例項product的型別的是product。
修改一下產品工廠類,給每個產品賦價值
產品工廠類
class productfactory
public product maketoycar()
}
回到主方法裡,例項化logger類的例項為logger取得其方法並以之建立委託log,並且傳入模板方法。
主函式
class program
}
結果:
委託使用注意事項:
IO 的一般使用原則
1 是檔案 fileinputstream,fileoutputstream,位元組流 filereader,filewriter 字元 2 是 byte bytearrayinputstream,bytearrayoutputstream 位元組流 3 是 char chararrayreader...
泛型的一般使用
泛型類 package com.generics public class genericsclass public void setelement e element public genericsclass public genericsclass e element public static...
const一般如何使用
c 基礎知識和清晰的頭腦 char greeting hello char p greeting non const pointer,non const data const char p greeting non const pointer,const data char const p gree...