• 装饰器Decorate方法实现Html1,增加一个Html1的引用,Decorate的构造方法加上Html1的参数来初始化Html1
    • 最佳实现场景其实就是去买奶茶,一杯原味奶茶加很多小料,如果按照原始方法,需要一开始就把奶茶+小料的各种叠加方法都要实现,比如A奶茶+A小料,A奶茶+B小料……这些方法,如果增加了一种奶茶,那么就又要重新写叠加的方法,这样子没几种奶茶就会造成类爆炸,
    • 装饰器模式是代替增加子类的一种解决方案,体现了聚合/合成复用原则的思想,尽量使用组合的方式来扩展功能,这样就把基本功能和扩展功能解耦了,使得代码可复用,可维护,灵活。关键点在于装饰器模式可以动态地为对象增加扩展功能。
    • 装饰器方法直接转发请求至引用对象
    • image.png
      1. public interface Html1 {
      2. void setText(String text);
      3. String getText();
      4. }
      5. class Span implements Html1{
      6. String text;
      7. @Override
      8. public void setText(String text) {
      9. this.text = text;
      10. }
      11. @Override
      12. public String getText() {
      13. return "<span>"+this.text+"</span>";
      14. }
      15. }
      16. class Decorate implements Html1{
      17. Html1 html1;
      18. public Decorate(Html1 html1){
      19. this.html1 = html1;
      20. }
      21. @Override
      22. public void setText(String text) {
      23. this.html1.setText(text);
      24. }
      25. @Override
      26. public String getText() {
      27. return this.html1.getText();
      28. }
      29. }
      30. class Ul extends Decorate{
      31. public Ul(Html1 html1) {
      32. super(html1);
      33. }
      34. public String getText(){
      35. return "<li>"+ html1.getText()+"</li>";
      36. }
      37. }
      38. class Div extends Decorate{
      39. public Div(Html1 html1) {
      40. super(html1);
      41. }
      42. public String getText(){
      43. return "<div>"+super.html1.getText()+"</div>";
      44. }
      45. }
      46. class Test{
      47. public static void main(String[] args) {
      48. Html1 html1 = new Div(new Ul(new Span()));
      49. html1.setText("Eason");
      50. System.out.println(html1.getText());//<div><li><span>Eason</span></li></div>
      51. }
      52. }