裝飾者模式以對客戶端透明的方式動態的為對象增加責任
我們經常要為某一些個別的對象增加一些新的職責
BodyContentFilterIntf
一個靈活的方法是將過濾器嵌入另一個過濾器中
其實java中 的過濾器模式應用非常多
LineNumberInputStream
FilterInputStream myStream=new LineNumberInputStream
( new BufferInputStream( new StringBufferInputStream( myStringBuffer)));
多個的Decorator被層疊在一起
我們定義一個接口BodyContentFilterIntf 來定義所有過濾器要實現的方法
public interface BodyContentFilterIntf {
public String filtContent(String aContent) throws ContentFilterException;
}
這個接口中只有一個方法filtContent
下面是一個可能的一個過濾器(保證輸入的字數多於
public class LengthContentFilter
implements BodyContentFilterIntf {
private BodyContentFilterIntf bodyContentFilterIntf = null;
public HtmlContentFilter(BodyContentFilterIntf aFilter)
{
bodyContentFilterIntf = aFilter;
}
public String filtContent(String aContent) throws ContentFilterException {
String l_Content = aContent;
If (bodyContentFilterIntf!=null)
_Content = bodyContentFilterIntf
if (aContent
throw new ContentFilterException (
return aContext;
}
}
這是另一個過濾器(偽碼
implements BodyContentFilterIntf {
private BodyContentFilterIntf bodyContentFilterIntf = null;
public SendEmailContentFilter(BodyContentFilterIntf aFilter)
{
bodyContentFilterIntf = aFilter;
}
public String filtContent(String aContent) throws ContentFilterException {
String l_Content = aContent;
if (bodyContentFilterIntf!=null)
l_Content = bodyContentFilterIntf
SendEmail(
return aContext;
}
}
當然還有SensitiveWordContextFilter(過濾敏感詞匯)
有了這些過濾器
try {
l_Content = new HtmlContentFilter(new SensitiveWordContextFilter(null))
filtContent(bodyContext);
}
catch (ContentFilterException ex) {
BBSCommon
return;
}
我們甚至可以動態的添加不同的過濾器
try {
BodyContentFilterIntf bodyContentFilterIntf = null;
bodyContentFilterIntf = new HtmlContentFilter(null);
if(IsMember==true)
bodyContentFilterIntf = new sendEmailContentFilter(bodyContentFilterIntf);
else
bodyContentFilterIntf = new SensitiveWordContextFilter(bodyContentFilterIntf);
l_Content = bodyContentFilterIntf
}
catch (ContentFilterException ex) {
BBSCommon
return;
}
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27457.html