裝飾者模式在 Java 框架中可透過以下三種方式實現:1. 介面裝飾者:建立實作特定介面的新類,為現有類別新增行為。 2. 類別裝飾者:建立繼承自現有類別的新類,新增新的行為。 3. 註解裝飾者:使用註解擴展現有類,透過自訂註解添加行為。這種模式在日誌記錄框架中廣泛應用,例如過濾日誌或新增時間戳記。
Java 框架中裝飾者模式的實作方式
裝飾者模式是一種結構型設計模式,它允許在不修改原有類別的情況下,動態地為物件新增新的功能。在Java 框架中,裝飾者模式有以下幾種實作方式:
1. 介面裝飾者
##這種實作方式透過建立一個實作某個特定接口的新類別來擴展現有類別。新類別可以將額外的行為新增到現有類別中,而無需修改現有類別的程式碼。public interface Shape { void draw(); } public class Rectangle implements Shape { @Override public void draw() { System.out.println("Drawing a rectangle"); } } public class DecoratedRectangle implements Shape { private Shape shape; public DecoratedRectangle(Shape shape) { this.shape = shape; } @Override public void draw() { shape.draw(); System.out.println("Adding extra decoration to rectangle"); } }
2. 類別裝飾者
這種實作方式透過建立一個新的類別來擴展現有類,該類別繼承自現有類別並添加新的行為。public class Shape { public void draw() { System.out.println("Drawing a shape"); } } public class DecoratedShape extends Shape { @Override public void draw() { super.draw(); System.out.println("Adding extra decoration to shape"); } }
3. 註解裝飾者
這種實作方式使用 Java 註解來擴充現有類別。可以透過建立自訂註解,然後將該註解應用於現有類別來新增新的行為。@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Decorated { String value(); } public class Shape { public void draw() { System.out.println("Drawing a shape"); } } @Decorated("rectangle") public class Rectangle extends Shape { @Override public void draw() { super.draw(); System.out.println("Drawing a rectangle"); } }
實戰案例
在日誌記錄框架中,裝飾者模式用於在日誌中新增額外的功能,例如過濾、新增時間戳記或將日誌傳送到不同的目的地。例如,下面使用Log4j 框架展示了一個裝飾者模式的實戰案例:import org.apache.log4j.Logger; import org.apache.log4j.Layout; import org.apache.log4j.Appender; import org.apache.log4j.varia.LevelMatchFilter; public class MyLoggingAppender extends AppenderSkeleton { private Appender appender; public MyLoggingAppender(Layout layout, Appender appender) { super(layout); this.appender = appender; } @Override public void close() { appender.close(); } @Override public boolean requiresLayout() { return false; } @Override protected void append(LoggingEvent event) { if (LevelMatchFilter()) { appender.doappend(new LoggingEvent(event.getLoggerName(), event.getLevel(), event.getMessage(), event.getThreadName(), event.getTimeStamp(), event.getLocationInfo(), event.getThrowableInformation(), event.getNDC(), event.getMDCCopy())); } } }在這個案例中,
MyLoggingAppender 類別是一個裝飾者,它透過添加過濾功能來擴展Appender 類。它將日誌事件傳遞給原始 Appender,但僅當日誌事件與指定的篩選器相符時才會傳遞。
以上是java框架中裝飾者模式的實作方式有哪些?的詳細內容。更多資訊請關注PHP中文網其他相關文章!