其實(shí)在作為一個(gè)java coder 在寫代碼的過程中可能會(huì)比較隨意,這顯然不是很好的,我們還是適當(dāng)可以優(yōu)化優(yōu)化,沒有最好只有更好。
1、談?wù)勀0迥J皆陧?xiàng)目中的使用
為什么要用它?模板模式我的理解就是把大部分邏輯在父類中實(shí)現(xiàn),只有一小部分邏輯是根據(jù)各個(gè)子類來(lái)千變?nèi)f化的。上例子:
public abstract class AbstractTemplate {
public void templateMethod(){
abstractMethod();
hookMethod();
concreteMethod();
}
protected abstract void abstractMethod();
protected void hookMethod(){}
}
public class ConcreteTemplate extends AbstractTemplate{
//基本方法的實(shí)現(xiàn)
@Override
public void abstractMethod() {
//業(yè)務(wù)相關(guān)的代碼
}
}
總結(jié):模板方法的目的就是該往上提的上到父類上去,該下放的就放到子類中去,如分頁(yè)功能中判斷頁(yè)碼部分就是通用的放在父類中,分頁(yè)完后處理邏輯是不一樣的放到每個(gè)子類中。
2、談?wù)勯T臉模式在項(xiàng)目中的使用
為什么要用它?門臉模式我認(rèn)為的就是盡量把功能塊之間松耦合,小到類的功能調(diào)用大到各種系統(tǒng)之間的調(diào)用,如我最好只暴露一個(gè)對(duì)外系統(tǒng)給外部門或者外公司的人使用,所有對(duì)外的功能都放在這個(gè)對(duì)外系統(tǒng)中,至于對(duì)外系統(tǒng)中的接口在內(nèi)部運(yùn)轉(zhuǎn)外部不需要知道。說(shuō)白點(diǎn)就是一個(gè)前臺(tái),你去醫(yī)院看病只需要找前臺(tái)就好了,她會(huì)告訴你眼科、五官科、廁所在哪,而你不需要盲目的去直接到處亂跑亂走找你要去的地方。說(shuō)遠(yuǎn)了,上例子:

public class ModuleA {
public void testA(){
System.out.println("調(diào)用ModuleA中的testA方法");
}}
public class ModuleB {
public void testB(){
System.out.println("調(diào)用ModuleB中的testB方法");
}}
public class Facade {
public void test(){
ModuleA a = new ModuleA();
a.testA();
ModuleB b = new ModuleB();
b.testB();
}
}
總結(jié):門臉模式用于解耦還是不錯(cuò)的。
3、談?wù)劜呗阅J皆陧?xiàng)目中的使用
為什么要用它?編程首選面向接口編程、其次再是抽象類編程。策略模式就是把實(shí)體之間的共同的行為抽象為接口。說(shuō)到這里我想談?wù)勎易约簩?duì)于接口和抽象類的理解,接口表示實(shí)體之間共同的行為,抽象類可以表示共同的行為以外還可以有自己的特性,如fly這么個(gè)動(dòng)作飛機(jī)可以有鳥類也可以有,這個(gè)時(shí)候fly()應(yīng)該是定義在接口中,像飛機(jī)可以載人,不同的機(jī)型可能載的人(客機(jī)、戰(zhàn)斗機(jī))不一樣。小鳥可以講鳥語(yǔ),不能的鳥講的語(yǔ)種可能(燕子、鴕鳥)不一樣,這個(gè)時(shí)候載人、講鳥語(yǔ)這種就可以定義在抽象類中,然后每個(gè)小種類去實(shí)現(xiàn)抽象類。還是上策略模式的例子吧:
public interface Strategy {
/**
* 策略方法
*/
public void strategyInterface();
}
public class ConcreteStrategyA implements Strategy {
@Override
public void strategyInterface() {
//相關(guān)的業(yè)務(wù)
}
}
public class ConcreteStrategyB implements Strategy {
@Override
public void strategyInterface() {
//相關(guān)的業(yè)務(wù)
}
}
public static void main(String[] args) {
Strategy strategyA = new ConcreteStrategyA();
strategyA.strategyInterface();
Strategy strategyB= new ConcreteStrategyB();
strategyB.strategyInterface();
}
總結(jié):策略模式能清晰定義接口,另外還有一個(gè)好處就是很多地方可以傳參Strategy strategy來(lái)實(shí)現(xiàn)不同實(shí)體之間的多態(tài)性,畢竟多態(tài)表現(xiàn)在同一個(gè)類里面是重載,父子類中則是重寫實(shí)現(xiàn)。
4、談?wù)勜?zé)任鏈模式在項(xiàng)目中的使用
何為鏈?就是環(huán)環(huán)相扣有序執(zhí)行,一個(gè)常用的場(chǎng)景是web service中的過濾器你可以配置多個(gè)過濾器來(lái)實(shí)現(xiàn)多重過濾。但我覺得它可以有另外一個(gè)衍生就是在于可以將所有的實(shí)現(xiàn)類隨意組裝后面會(huì)講到。上例子:
public abstract class Handler {
protected Handler successor = null;
public Handler getSuccessor() {
return successor;
}
public void setSuccessor(Handler successor) {
this.successor = successor;
}
/**
* 處理聚餐費(fèi)用的申請(qǐng)
* @param user ? ?申請(qǐng)人
* @param fee ? ?申請(qǐng)的錢數(shù)
* @return ? ? ? ?成功或失敗的具體通知
*/
public abstract String handleFeeRequest(String user , double fee);
}
public class ProjectManager extends Handler {
@Override
public String handleFeeRequest(String user, double fee) {
String str = "";
//項(xiàng)目經(jīng)理權(quán)限比較小,只能在500以內(nèi)
if(fee < 500)
{
//為了測(cè)試,簡(jiǎn)單點(diǎn),只同意張三的請(qǐng)求
if("張三".equals(user))
{
str = "成功:項(xiàng)目經(jīng)理同意【" + user + "】的聚餐費(fèi)用,金額為" + fee + "元";
}else
{
//其他人一律不同意
str = "失敗:項(xiàng)目經(jīng)理不同意【" + user + "】的聚餐費(fèi)用,金額為" + fee + "元";
}
}else
{
//超過500,繼續(xù)傳遞給級(jí)別更高的人處理
if(getSuccessor() != null)
{
return getSuccessor().handleFeeRequest(user, fee);
}
}
return str;
}
}
public class DeptManager extends Handler {
@Override
public String handleFeeRequest(String user, double fee) {
String str = "";
//部門經(jīng)理的權(quán)限只能在1000以內(nèi)
if(fee < 1000)
{
//為了測(cè)試,簡(jiǎn)單點(diǎn),只同意張三的請(qǐng)求
if("張三".equals(user))
{
str = "成功:部門經(jīng)理同意【" + user + "】的聚餐費(fèi)用,金額為" + fee + "元";
}else
{
//其他人一律不同意
str = "失?。翰块T經(jīng)理不同意【" + user + "】的聚餐費(fèi)用,金額為" + fee + "元";
}}
else{
//超過1000,繼續(xù)傳遞給級(jí)別更高的人處理
if(getSuccessor() != null){
return getSuccessor().handleFeeRequest(user, fee);
}}
return str;
}
}
public static void main(String[] args) {
//先要組裝責(zé)任鏈
Handler h2 = new DeptManager();
Handler h3 = new ProjectManager();
h3.setSuccessor(h2);
//開始測(cè)試
String test1 = h3.handleFeeRequest("張三", 300);
System.out.println("test1 = " + test1);
String test2 = h3.handleFeeRequest("李四", 300);
System.out.println("test2 = " + test2);
}
上面是很純的責(zé)任鏈模式,其實(shí)用的場(chǎng)景不是特別多,因?yàn)樗亲咭辉庀聛?lái)只有一個(gè)功能會(huì)調(diào)用不滿足情況的時(shí)候會(huì)繼續(xù)找下一鏈這樣遍歷效率也不高。下面我就來(lái)講講衍生的責(zé)任鏈模式,就是通常講的不是很純的責(zé)任鏈模式:
public interface IHandler {
void process();
}
public class Test1Handler implements IHandler {
@Override
public void process() {
System.out.println("執(zhí)行test1過程");
}
}
public class Test2Handler implements IHandler {
@Override
public void process() {
System.out.println("執(zhí)行test2過程");
}
}
public static void main(String[] args) {Listlist = new ArrayList<>(2);
list.add(new Test1Handler());
list.add(new Test2Handler());
for(IHandler handler : list){
handler.process();
}
list.clear();
list.add(new Test2Handler());
list.add(new Test1Handler());
for(IHandler handler : list){
handler.process();
}}
sys結(jié)果:
行test1過程
執(zhí)行test2過程
執(zhí)行test2過程
執(zhí)行test1過程
對(duì)于具體的實(shí)現(xiàn)可以借助集合、配置文件來(lái)靈活組裝執(zhí)行。
總結(jié):我們?cè)趯懘a的過程中也不一定嚴(yán)格按照23種模式去寫,有的時(shí)候也會(huì)有一些變通。
最后總結(jié):我想我不會(huì)把所有的模式都列出來(lái)我也不會(huì)照抄過來(lái),只是列出一些在實(shí)際的項(xiàng)目中常用的,切記不要因?yàn)槟J蕉J侥菢痈杏X會(huì)太重了。設(shè)計(jì)模式的宗旨是啥?我認(rèn)為提高拓展性、降低耦合、易維護(hù)、可讀性強(qiáng)。
最后的最后,獻(xiàn)丑了?。?!