• JAVA设计模式初探之装饰者模式


    【参考一】http://blog.csdn.net/jason0539/article/details/22713711

    【参考二】http://www.cnblogs.com/java-my-life/archive/2012/04/20/2455726.html

    【参考三】

    下面是一个装饰模式的例子。

    有一个接口FontProvider,用来提供字体。

    有一个实现类DefaultFontProvider实现了这个接口。

    现在我们有一个需求,因为每次都新生成字体很占资源。

    所以我们想给这个类加上缓存功能。

    当然,我们可以修改DefaultFontProvider类,

    但是可能别的类已经引用了这个类,修改可能引入BUG。

    当然,我们还可以继承这个类,但是假设对象是外部注入的。

    甚至我们也不知道这个类的实现类。只知道其接口。也就无从扩展。

    只有一个接口对象的实例,我们能扩展其行为吗?

    可以,那就是装饰模式。

    下面可以可以看到,被装饰后的对象。

    使用方法和原对象一致,其行为却已经改变。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    import java.awt.Font;
    import java.util.HashMap;
    import java.util.Map;
     
    interface FontProvider {
        public Font getFont(String name);
    }
     
    class DefaultFontProvider implements FontProvider {
        public Font getFont(String name) {
            return new Font(name, Font.PLAIN, 12);
        }
    }
     
    class BufferedFontProvider implements FontProvider {
     
        private FontProvider fontProvider;
        private Map<String, Font> fontCache = new HashMap();
     
        public BufferedFontProvider(FontProvider fontProvider) {
            this.fontProvider = fontProvider;
        }
     
        public Font getFont(String name) {
            if (!fontCache.containsKey(name)) {
                fontCache.put(name, fontProvider.getFont(name));
            }
            return fontCache.get(name);
        }
    }
     
    public class Demo {
        //这里我们假设这个fontProvider对象是注入的。
        private static FontProvider fontProvider = new DefaultFontProvider();
     
        public static void main(String[] args) {
            Font font = fontProvider.getFont("微软雅黑");
            Font font2 = fontProvider.getFont("微软雅黑");
            System.out.println(font == font2);//false
     
            fontProvider = new BufferedFontProvider(fontProvider);
            Font font3 = fontProvider.getFont("微软雅黑");
            Font font4 = fontProvider.getFont("微软雅黑");
            System.out.println(font3 == font4);//true
        }
    }

     使用装饰模式的好处,还有一个,假设我将来有一个从网络获取字体的实现类,如

    1
    FontProvider fontProvider = new NetFontProvider();

    使用我们的装饰类依然可以给其添加缓冲功能。

    ----

    后话,今年以来非常流行的AOP的编程思想,其实就是来源于装饰模式。

    ----

    后后话,面向对象,面向接口,依赖注入,AOP。

    这些编程思想是我们创造优质程序的有利武器。

  • 相关阅读:
    canvas 方法参数智能提示
    layui 关闭弹窗,刷新父窗体页面
    UI设计灵感集结地
    Java Poi 读取excel 对所有类型进行处理
    jeecg v3.6.6 excel导入js方法完善
    父、子页面之间页面元素的获取,方法的调用
    ps载入渐变
    ps载入画笔
    做设计常用的素材下载网站
    色彩搭配神器
  • 原文地址:https://www.cnblogs.com/dixinyunpan/p/5864943.html
Copyright © 2020-2023  润新知