public abstract class AbstractObject {//操作public abstract void operation();
}
public class RealObject extends AbstractObject {@Overridepublic void operation() {//一些操作System.out.println("一些操作");}
}
public class ProxyObject extends AbstractObject{RealObject realObject = new RealObject();@Overridepublic void operation() {//調用目標對象之前可以做相關操作System.out.println("before"); realObject.operation(); //調用目標對象之后可以做相關操作System.out.println("after");}
}
public class Client {public static void main(String[] args) {// TODO Auto-generated method stubAbstractObject obj = new ProxyObject();obj.operation();}
}
案例二
public interface FontProvider {Font getFont(String name);
}
public abstract class ProviderFactory {public static FontProvider getFontProvider() {return new FontProviderFromDisk();}
}
public class Main() {public static void main(String[] args) {FontProvider fontProvider = ProviderFactory.getFontProvider();Font font = fontProvider.getFont("微軟雅黑");......}
}
//現在我們希望給他加上一個緩存功能,我們可以用靜態代理來完成
public class CachedFontProvider implements FontProvider {private FontProvider fontProvider;private Map<String, Font> cached;public CachedFontProvider(FontProvider fontProvider) {this.fontProvider = fontProvider;}public Font getFont(String name) {Font font = cached.get(name);if (font == null) {font = fontProvider.getFont(name);cached.put(name, font);}return font;}
}
/* 對工廠類進行相應修改,代碼使用處不必進行任何修改。 這也是面向接口編程以及工廠模式的一個好處 */
public abstract class ProviderFactory {public static FontProvider getFontProvider() {return new CachedFontProvider(new FontProviderFromDisk());}
}