- 装饰器Decorate方法实现Html1,增加一个Html1的引用,Decorate的构造方法加上Html1的参数来初始化Html1
- 最佳实现场景其实就是去买奶茶,一杯原味奶茶加很多小料,如果按照原始方法,需要一开始就把奶茶+小料的各种叠加方法都要实现,比如A奶茶+A小料,A奶茶+B小料……这些方法,如果增加了一种奶茶,那么就又要重新写叠加的方法,这样子没几种奶茶就会造成类爆炸,
- 装饰器模式是代替增加子类的一种解决方案,体现了聚合/合成复用原则的思想,尽量使用组合的方式来扩展功能,这样就把基本功能和扩展功能解耦了,使得代码可复用,可维护,灵活。关键点在于装饰器模式可以动态地为对象增加扩展功能。
- 装饰器方法直接转发请求至引用对象
public interface Html1 {
void setText(String text);
String getText();
}
class Span implements Html1{
String text;
@Override
public void setText(String text) {
this.text = text;
}
@Override
public String getText() {
return "<span>"+this.text+"</span>";
}
}
class Decorate implements Html1{
Html1 html1;
public Decorate(Html1 html1){
this.html1 = html1;
}
@Override
public void setText(String text) {
this.html1.setText(text);
}
@Override
public String getText() {
return this.html1.getText();
}
}
class Ul extends Decorate{
public Ul(Html1 html1) {
super(html1);
}
public String getText(){
return "<li>"+ html1.getText()+"</li>";
}
}
class Div extends Decorate{
public Div(Html1 html1) {
super(html1);
}
public String getText(){
return "<div>"+super.html1.getText()+"</div>";
}
}
class Test{
public static void main(String[] args) {
Html1 html1 = new Div(new Ul(new Span()));
html1.setText("Eason");
System.out.println(html1.getText());//<div><li><span>Eason</span></li></div>
}
}