java装饰模式和继承的区别
答案:3 悬赏:10 手机版
解决时间 2021-11-10 05:35
- 提问者网友:欲望失宠
- 2021-11-09 15:38
java装饰模式和继承的区别
最佳答案
- 五星知识达人网友:旧脸谱
- 2021-11-09 15:49
java装饰模式和继承的区别如下:
装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。
装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。
全部回答
- 1楼网友:北城痞子
- 2021-11-09 17:42
下面是一个装饰模式的例子。
有一个接口FontProvider,用来提供字体。
有一个实现类DefaultFontProvider实现了这个接口。
现在我们有一个需求,因为每次都新生成字体很占资源。
所以我们想给这个类加上缓存功能。
当然,我们可以修改DefaultFontProvider类,
但是可能别的类已经引用了这个类,修改可能引入BUG。
当然,我们还可以继承这个类,但是假设对象是外部注入的。
甚至我们也不知道这个类的实现类。只知道其接口。也就无从扩展。
只有一个接口对象的实例,我们能扩展其行为吗?
可以,那就是装饰模式。
下面可以可以看到,被装饰后的对象。
使用方法和原对象一致,其行为却已经改变。
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
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
}
}
使用装饰模式的好处,还有一个,假设我将来有一个从网络获取字体的实现类,如
FontProvider fontProvider = new NetFontProvider();使用我们的装饰类依然可以给其添加缓冲功能。
----
后话,今年以来非常流行的AOP的编程思想,其实就是来源于装饰模式。
----
后后话,面向对象,面向接口,依赖注入,AOP。
这些编程思想是我们创造优质程序的有利武器。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯