introduction:
装饰者模式:
装饰者对象和被装饰者对象有相同的超类型,这里我们利用继承达到类型匹配,而不是用继承获得"行为"
可以使用一个或者多个装饰者包装一个对象
既然装饰者和被装饰者对象有相同的超类型,所以在任何需要原始对象(被包装的)场合,可以用装饰过的对象代替它
装饰者可以在所委托被装饰者行为之前与之后加上自己的行为,以达到特定的目的
对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用喜欢的装饰者来装饰对象
动态地将职责附加到对象上。若要扩展功能,装饰者提供比继承更有弹性的替代方案
继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式
demo:
用装饰者模式描述javaweb开发前后端技术。后端以java作为开发技术,前端有css,html,jQuery多种技术,java技术需要配合前端多种技术使用。
Technology.java
public interface Technology {
String getDescription();
}
Server.java
public class Server implements Technology{
public String description = "java";
@Override
public String getDescription() {
return description;
}
}
Client.java
public interface Client extends Technology{
String getDescription();
}
Html.java
public class Html implements Client{
public Technology technology;
public Html(Technology technology) {
this.technology = technology;
}
@Override
public String getDescription() {
return technology.getDescription()+", html";
}
}
Css.java
public class Css implements Client{
public Technology technology;
public Css(Technology technology) {
this.technology = technology;
}
@Override
public String getDescription() {
return technology.getDescription()+", css";
}
}
JQuery.java
public class JQuery implements Client{
public Technology technology;
public JQuery(Technology technology) {
this.technology = technology;
}
@Override
public String getDescription() {
return technology.getDescription()+", jQuery";
}
}
Test.java
public class Test {
public static void main(String[] args) {
Technology java = new Server();
java = new Html(java);
java = new JQuery(java);
java = new Css(java);
System.out.println(java.getDescription());
}
}
输出结果:
java, html, jQuery, css
在以上装饰者模式中,使用前端等多种技术装饰后端技术。