装饰模式在中国的工作生活中都有很多呈现场景,这个和中庸文化有关,说话做事都不能太直接,需要技巧。
比如你想批评一个人,如果一上来就劈头盖脸直接说你这不好那不好,这是要出事的,特别是武汉人,绝对跟你急。
你要先表扬一下,然后来再指出出哪里还不够好,最后还鼓励一下的话,绝对会对你鞠躬尽瘁的。
又比如《谁能》上一般几个男生向女嘉宾表白时,女嘉宾总是很嘚瑟的,“首先你很好,……(此处略去,反正都是怎么怎么好的)”最后来一个“但是”,基本上这个男嘉宾就可以回去了。这些说话的方式都是装饰模式。
说了这么多,还是有人对装饰模式的定义不够明朗。
一句话,装饰模式就是在你想表达本意之前为了让人更容易接受要先进行一番修饰(美化)。
专业术语:装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象出游被装饰对象的实例。
举个例子,其实人的伪装也是一种装饰模式,一个人本性是冷漠的,但是在某种情况下可以伪装成热情的,关系图如下:
Source类是被装饰接口(表示一个人),Decorator类是一个装饰类(表示人的伪装技术),可以为Source类动态的添加一些功能(比如人的本性nature方法),代码如下:
Sourceable.java
package com.freedom.decorater;
public interface Sourceable {
//人的本性
public void nature();
}
Source.java
package com.freedom.decorater;
public class Source implements Sourceable {
@Override
public void nature() {
System.out.println("Nature before decorating : cool");
}
}
Decorator.java
package com.freedom.decorater;
public class Decorater implements Sourceable {
private Sourceable source;
public Decorater(Sourceable source){
super();
this.source = source;
}
@Override
public void nature() {
source.nature();
System.out.println("Nature after decorating : entusiastico");
}
}
测试:
package com.freedom.decorater;
import org.junit.Test;
public class TestDecorate {
@Test
public void test() {
Sourceable source = new Source();
Sourceable sa = new Decorater(source);
sa.nature();
}
}
输出结果:
最后再来小结一下:
1.装饰器模式的应用场景:
1)需要扩展一个类的功能。
2)动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)
2.缺点:产生过多相似的对象,不易排错!