Java設計模式之門面設計模式(外觀模式)與 log4j.properties配置詳解

Java設計模式之門面設計模式(外觀模式)與 log4j.properties配置詳解

  • Java設計模式之門面設計模式(外觀模式)
    定義
意圖:爲系統中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得子系統更加容易使用。
主要解決:降低訪問複雜系統的內部子系統時的複雜度,簡化客戶端與之的接口。
何時使用: 1、客戶端不需要知道系統內部的複雜聯繫,整個系統只需提供一個"接待員"即可。 2、定義系統的入口。
如何解決:客戶端不與系統耦合,外觀類與系統耦合。
關鍵代碼:在客戶端和複雜系統之間再加一層,這一層將調用順序、依賴關係等處理好。
應用實例: 1、去醫院看病,可能要去掛號、門診、劃價、取藥,讓患者或患者家屬覺得很複雜,如果有提供接待人員,只讓
接待人員來處理,就很方便。 2、JAVA 的三層開發模式。
優點: 1、減少系統相互依賴。 2、提高靈活性。 3、提高了安全性。
缺點:不符合開閉原則,如果要改東西很麻煩,繼承重寫都不合適。
使用場景: 1、爲複雜的模塊或子系統提供外界訪問的模塊。 2、子系統相對獨立。 3、預防低水平人員帶來的風險。
注意事項:在層次化結構中,可以使用外觀模式定義系統中每一層的入口。

以上定義摘抄自 菜鳥教程~


角色及使用場景
門面設計模式
簡單來說,該模式就是把一些複雜的流程封裝成一個接口供給外部用戶更簡單的使用,從設計類圖來看,這個模式中,涉及到3個角色。
1)門面角色:外觀模式的核心。它被客戶調用,它熟悉子系統的功能。內部根據客戶角色的需求預定了幾種功能的組合。
2)子系統角色:實現了子系統的功能。它對客戶角色和Facade時未知的。它內部可以有系統內的相互交互,也可以由供外界調用的接口。
3)客戶角色:通過調用Facede來完成要實現的功能。

實例
CPU類:

package com.chen;
import org.apache.log4j.Logger;
public class CPU {
    private static final Logger LOGGER = Logger.getLogger(CPU.class);
    public void start(){
        LOGGER.info("cpu is starting...");
    }

    public void shutdown(){
        LOGGER.info("cpu has shutdown...");
    }
}

Disk 類:

package com.chen;
import org.apache.log4j.Logger;
public class Disk {
    private static final Logger LOGGER = Logger.getLogger(Disk.class);
    public void start(){
        LOGGER.info("Disk is start...");
    }
    public void shutDown(){
        LOGGER.info("Disk is shutDown...");
    }
}

Memory 類:

package com.chen;
import org.apache.log4j.Logger;
public class Memory {
    public static final Logger LOGGER = Logger.getLogger(Memory.class);
    public void start(){
        LOGGER.info("Memory is start...");
    } 
    public void shutDown(){
        LOGGER.info("Memory is shutDown...");
    }

}

門面類:

package com.chen;
import org.apache.log4j.Logger;
public class DoorDesign {
    private Logger LOGGER = Logger.getLogger(DoorDesign.class);
    private CPU cpu;
    private Memory memory;
    private Disk disk;
    public DoorDesign() {
        cpu = new CPU();
        memory = new Memory();
        disk = new Disk();
    }
    public void start(){
        LOGGER.info("computer start begin...");
        cpu.start();
        disk.start();
        memory.start();
        LOGGER.info("computer start end!");
    }
    public void shutdown(){
        LOGGER.info("computer end begin...");
        cpu.shutdown();
        disk.shutDown();
        memory.shutDown();
        LOGGER.info("computer shutdown end!");
    }

}

客戶類:

package com.chen;
import org.apache.log4j.Logger;
public class Client {
    private static final Logger LOGGER = Logger.getLogger(Client.class);
    public static void main(String[] args) {
        DoorDesign doorDesign = new DoorDesign();
        doorDesign.start();
        LOGGER.info("___________");
        doorDesign.shutdown();

    }
}

控制檯輸出:

2018-01-23 15:51:37 [INFO]-[com.chen.DoorDesign] computer start begin...
  2018-01-23 15:51:37 [INFO]-[com.chen.CPU] cpu is starting...
  2018-01-23 15:51:37 [INFO]-[com.chen.Disk] Disk is start...
  2018-01-23 15:51:37 [INFO]-[com.chen.Memory] Memory is start...
  2018-01-23 15:51:37 [INFO]-[com.chen.DoorDesign] computer start end!
  2018-01-23 15:51:37 [INFO]-[com.chen.Client] ___________
  2018-01-23 15:51:37 [INFO]-[com.chen.DoorDesign] computer end begin...
  2018-01-23 15:51:37 [INFO]-[com.chen.CPU] cpu has shutdown...
  2018-01-23 15:51:37 [INFO]-[com.chen.Disk] Disk is shutDown...
  2018-01-23 15:51:37 [INFO]-[com.chen.Memory] Memory is shutDown...
  2018-01-23 15:51:37 [INFO]-[com.chen.DoorDesign] computer shutdown end!

從上面的實例來看,有了這個Facade類,也就是DoorDesign類,用戶就不用親自去調用子系統中的Disk,Memory、CPU類了,不需要知道系統內部的實現細節,甚至都不用知道系統內部的構成。客戶端只需要跟Facade交互就可以了。
log4j.properties



----------


### set log levels ###  
log4j.rootLogger = INFO,console
### console ###  
log4j.appender.console = org.apache.log4j.ConsoleAppender  
log4j.appender.console.Target = System.out  
log4j.appender.console.layout = org.apache.log4j.PatternLayout  
log4j.appender.console.layout.ConversionPattern = %-d{yyyy-MM-dd HH\:mm\:ss} [%p]-[%c] %m%n  

上面涉及到日誌相關內容,所以容我從網絡上再次搬運:

#①配置根Logger,其語法爲: 
# 
#log4j.rootLogger = [level],appenderName,appenderName2,... 
#level是日誌記錄的優先級,分爲OFF,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,ALL 
##Log4j建議只使用四個級別,優先級從低到高分別是DEBUG,INFO,WARN,ERROR 
#通過在這裏定義的級別,您可以控制到應用程序中相應級別的日誌信息的開關 
#比如在這裏定義了INFO級別,則應用程序中所有DEBUG級別的日誌信息將不被打印出來 
#appenderName就是指定日誌信息輸出到哪個地方。可同時指定多個輸出目的 
################################################################################ 
#②配置日誌信息輸出目的地Appender,其語法爲: 
# 
#log4j.appender.appenderName = fully.qualified.name.of.appender.class 
#log4j.appender.appenderName.optionN = valueN 
# 
#Log4j提供的appender有以下幾種: 
#1)org.apache.log4j.ConsoleAppender(輸出到控制檯) 
#2)org.apache.log4j.FileAppender(輸出到文件) 
#3)org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌文件) 
#4)org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件) 
#5)org.apache.log4j.WriterAppender(將日誌信息以流格式發送到任意指定的地方) 
# 
#1)ConsoleAppender選項屬性 
# -Threshold = DEBUG:指定日誌消息的輸出最低層次 
# -ImmediateFlush = TRUE:默認值是true,所有的消息都會被立即輸出 
# -Target = System.err:默認值System.out,輸出到控制檯(err爲紅色,out爲黑色) 
# 
#2)FileAppender選項屬性 
# -Threshold = INFO:指定日誌消息的輸出最低層次 
# -ImmediateFlush = TRUE:默認值是true,所有的消息都會被立即輸出 
# -File = C:\log4j.log:指定消息輸出到C:\log4j.log文件 
# -Append = FALSE:默認值true,將消息追加到指定文件中,false指將消息覆蓋指定的文件內容 
# -Encoding = UTF-8:可以指定文件編碼格式 
# 
#3)DailyRollingFileAppender選項屬性 
# -Threshold = WARN:指定日誌消息的輸出最低層次 
# -ImmediateFlush = TRUE:默認值是true,所有的消息都會被立即輸出 
# -File = C:\log4j.log:指定消息輸出到C:\log4j.log文件 
# -Append = FALSE:默認值true,將消息追加到指定文件中,false指將消息覆蓋指定的文件內容 
# -DatePattern='.'yyyy-ww:每週滾動一次文件,即每週產生一個新的文件。還可以按用以下參數: 
#              '.'yyyy-MM:每月 
#              '.'yyyy-ww:每週 
#              '.'yyyy-MM-dd:每天 
#              '.'yyyy-MM-dd-a:每天兩次 
#              '.'yyyy-MM-dd-HH:每小時 
#              '.'yyyy-MM-dd-HH-mm:每分鐘 
# -Encoding = UTF-8:可以指定文件編碼格式 
# 
#4)RollingFileAppender選項屬性 
# -Threshold = ERROR:指定日誌消息的輸出最低層次 
# -ImmediateFlush = TRUE:默認值是true,所有的消息都會被立即輸出 
# -File = C:/log4j.log:指定消息輸出到C:/log4j.log文件 
# -Append = FALSE:默認值true,將消息追加到指定文件中,false指將消息覆蓋指定的文件內容 
# -MaxFileSize = 100KB:後綴可以是KB,MB,GB.在日誌文件到達該大小時,將會自動滾動.如:log4j.log.1 
# -MaxBackupIndex = 2:指定可以產生的滾動文件的最大數 
# -Encoding = UTF-8:可以指定文件編碼格式 
################################################################################ 
################################################################################ 
#③配置日誌信息的格式(佈局),其語法爲: 
# 
#log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class 
#log4j.appender.appenderName.layout.optionN = valueN 
# 
#Log4j提供的layout有以下幾種: 
#5)org.apache.log4j.HTMLLayout(以HTML表格形式佈局) 
#6)org.apache.log4j.PatternLayout(可以靈活地指定佈局模式) 
#7)org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串) 
#8)org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息) 
#9)org.apache.log4j.xml.XMLLayout(以XML形式佈局) 
# 
#5)HTMLLayout選項屬性 
# -LocationInfo = TRUE:默認值false,輸出java文件名稱和行號 
# -Title=Struts Log Message:默認值 Log4J Log Messages 
# 
#6)PatternLayout選項屬性 
# -ConversionPattern = %m%n:格式化指定的消息(參數意思下面有) 
# 
#9)XMLLayout選項屬性 
# -LocationInfo = TRUE:默認值false,輸出java文件名稱和行號 
# 
#Log4J採用類似C語言中的printf函數的打印格式格式化日誌信息,打印參數如下: 
# %m 輸出代碼中指定的消息 
# %p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL 
# %r 輸出自應用啓動到輸出該log信息耗費的毫秒數 
# %c 輸出所屬的類目,通常就是所在類的全名 
# %t 輸出產生該日誌事件的線程名 
# %n 輸出一個回車換行符,Windows平臺爲“\r\n”,Unix平臺爲“\n” 
# %d 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也可以在其後指定格式 
#    如:%d{yyyy年MM月dd日 HH:mm:ss,SSS},輸出類似:2012年01月05日 22:10:28,921 
# %l 輸出日誌事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數 
#    如:Testlog.main(TestLog.java:10) 
# %F 輸出日誌消息產生時所在的文件名稱 
# %L 輸出代碼中的行號 
# %x 輸出和當前線程相關聯的NDC(嵌套診斷環境),像java servlets多客戶多線程的應用中 
# %% 輸出一個"%"字符 
# 
# 可以在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對齊方式。如: 
#  %5c: 輸出category名稱,最小寬度是5,category<5,默認的情況下右對齊 
#  %-5c:輸出category名稱,最小寬度是5,category<5,"-"號指定左對齊,會有空格 
#  %.5c:輸出category名稱,最大寬度是5,category>5,就會將左邊多出的字符截掉,<5不會有空格 
#  %20.30c:category名稱<20補空格,並且右對齊,>30字符,就從左邊交遠銷出的字符截掉 
################################################################################ 
#④指定特定包的輸出特定的級別 
#log4j.logger.org.springframework=DEBUG 
################################################################################ 

#OFF,systemOut,logFile,logDailyFile,logRollingFile,logMail,logDB,ALL 
log4j.rootLogger =ALL,systemOut,logFile,logDailyFile,logRollingFile,logMail,logDB 

#輸出到控制檯 
log4j.appender.systemOut = org.apache.log4j.ConsoleAppender 
log4j.appender.systemOut.layout = org.apache.log4j.PatternLayout 
log4j.appender.systemOut.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n 
log4j.appender.systemOut.Threshold = DEBUG 
log4j.appender.systemOut.ImmediateFlush = TRUE 
log4j.appender.systemOut.Target = System.out 

#輸出到文件 
log4j.appender.logFile = org.apache.log4j.FileAppender 
log4j.appender.logFile.layout = org.apache.log4j.PatternLayout 
log4j.appender.logFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n 
log4j.appender.logFile.Threshold = DEBUG 
log4j.appender.logFile.ImmediateFlush = TRUE 
log4j.appender.logFile.Append = TRUE 
log4j.appender.logFile.File = ../Struts2/WebRoot/log/File/log4j_Struts.log 
log4j.appender.logFile.Encoding = UTF-8 

#按DatePattern輸出到文件 
log4j.appender.logDailyFile = org.apache.log4j.DailyRollingFileAppender 
log4j.appender.logDailyFile.layout = org.apache.log4j.PatternLayout 
log4j.appender.logDailyFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n 
log4j.appender.logDailyFile.Threshold = DEBUG 
log4j.appender.logDailyFile.ImmediateFlush = TRUE 
log4j.appender.logDailyFile.Append = TRUE 
log4j.appender.logDailyFile.File = ../Struts2/WebRoot/log/DailyFile/log4j_Struts 
log4j.appender.logDailyFile.DatePattern = '.'yyyy-MM-dd-HH-mm'.log' 
log4j.appender.logDailyFile.Encoding = UTF-8 

#設定文件大小輸出到文件 
log4j.appender.logRollingFile = org.apache.log4j.RollingFileAppender 
log4j.appender.logRollingFile.layout = org.apache.log4j.PatternLayout 
log4j.appender.logRollingFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n 
log4j.appender.logRollingFile.Threshold = DEBUG 
log4j.appender.logRollingFile.ImmediateFlush = TRUE 
log4j.appender.logRollingFile.Append = TRUE 
log4j.appender.logRollingFile.File = ../Struts2/WebRoot/log/RollingFile/log4j_Struts.log 
log4j.appender.logRollingFile.MaxFileSize = 1MB 
log4j.appender.logRollingFile.MaxBackupIndex = 10 
log4j.appender.logRollingFile.Encoding = UTF-8 

#用Email發送日誌 
log4j.appender.logMail = org.apache.log4j.net.SMTPAppender 
log4j.appender.logMail.layout = org.apache.log4j.HTMLLayout 
log4j.appender.logMail.layout.LocationInfo = TRUE 
log4j.appender.logMail.layout.Title = Struts2 Mail LogFile 
log4j.appender.logMail.Threshold = DEBUG 
log4j.appender.logMail.SMTPDebug = FALSE 
log4j.appender.logMail.SMTPHost = SMTP.163.com 
log4j.appender.logMail.From = xly3000@163.com 
log4j.appender.logMail.To = [email protected] 
#log4j.appender.logMail.Cc = [email protected] 
#log4j.appender.logMail.Bcc = [email protected] 
log4j.appender.logMail.SMTPUsername = xly3000 
log4j.appender.logMail.SMTPPassword = 1234567 
log4j.appender.logMail.Subject = Log4j Log Messages 
#log4j.appender.logMail.BufferSize = 1024 
#log4j.appender.logMail.SMTPAuth = TRUE 

#將日誌登錄到MySQL數據庫 
log4j.appender.logDB = org.apache.log4j.jdbc.JDBCAppender 
log4j.appender.logDB.layout = org.apache.log4j.PatternLayout 
log4j.appender.logDB.Driver = com.mysql.jdbc.Driver 
log4j.appender.logDB.URL = jdbc:mysql://127.0.0.1:3306/xly 
log4j.appender.logDB.User = root 
log4j.appender.logDB.Password = 123456 
log4j.appender.logDB.Sql = INSERT INTOT_log4j(project_name,create_date,level,category,file_name,
thread_name,line,all_category,message)values('Struts2','%d{yyyy-MM-ddHH:mm:ss}','%p','%c',
'%F','%t','%L','%l','%m')

以上內容 摘自網絡 謹作爲生疏時候看看~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章