淺談java項(xiàng)目中code 思想

其實(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)丑了?。?!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,679評(píng)論 18 399
  • 1 場(chǎng)景問題# 1.1 申請(qǐng)聚餐費(fèi)用## 來(lái)考慮這樣一個(gè)功能:申請(qǐng)聚餐費(fèi)用的管理。 很多公司都有這樣的福利,就是項(xiàng)...
    七寸知架構(gòu)閱讀 3,282評(píng)論 3 58
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 4,011評(píng)論 0 11
  • 此刻起,一張白紙等待未來(lái)你的繪圖,過好接下來(lái)的每一天......
    夏小秋閱讀 254評(píng)論 1 1

友情鏈接更多精彩內(nèi)容