java设计优化--装饰者模式
装饰者模式拥有一个设计非常巧妙的结构,它可以动态的添加功能。在基本的设计原则中,有一条重要的设计准则就是合成/聚合复用原则。根据该原则的思想,代码复用应该尽可能使用委托,而不是使用继承。因为继承是一种紧密耦合,父类的任何改动都会影响其子类,不利于系统维护。而委托是松散耦合,只要接口不变,委托类的改变不会影响其上层对象。
装饰者模式就是充分利用这种思想,利用委托,复用系统中的各个组件,在运行时,可以将这些组件进行叠加,构成一个“超级对象”,使其拥有各个组件的功能。而各个子模块的功能,被很好的维护在了相关组件的类中,拥有整洁的系统结构。
装饰者模式可以有效的分离性能组件和功能组件,从而提升系统的可维护性并增加模块的复用。
装饰者和被装饰者实现相同的接口,被装饰者通常是核心组件,完成特定的功能目标。而装饰者可以在被装饰者的前后,加上特定的前置和后置处理,增强被装饰者的功能。
装饰者模式案例:对输出结果的增强。首先将结果转换成html文本,再添加html头。
代码实现:
接口实现:
1 public interface IPacketCreator { 2 public String handleContent(); 3 }
被装饰者类:
1 public class PacketBodyCreator implements IPacketCreator { 2 3 @Override 4 public String handleContent() { 5 return "Content of oacket"; 6 } 7 8 }
被装饰者核心组件:
public abstract class PacketDecorator implements IPacketCreator { IPacketCreator component; public PacketDecorator(IPacketCreator component) { this.component = component; } }
装饰者:
1 public class PacketHtmlHanderCreator extends PacketDecorator { 2 3 4 public PacketHtmlHanderCreator(IPacketCreator component) { 5 super(component); 6 } 7 8 @Override 9 public String handleContent() { 10 StringBuffer sb = new StringBuffer(); 11 sb.append("<html>"); 12 sb.append("<body>"); 13 sb.append(component.handleContent()); 14 sb.append("</html>"); 15 sb.append("</body>"); 16 return sb.toString(); 17 } 18 19 }
1 public class PacketHttpHeaderCreator extends PacketDecorator { 2 3 public PacketHttpHeaderCreator(IPacketCreator component) { 4 super(component); 5 } 6 7 @Override 8 public String handleContent() { 9 StringBuffer sb = new StringBuffer(); 10 sb.append("Cache"); 11 sb.append(new Date()); 12 sb.append(component.handleContent()); 13 return sb.toString(); 14 } 15 16 }
客户端代码:
1 public class Client { 2 3 public static void main(String[] args) { 4 IPacketCreator packetCreator = new PacketHttpHeaderCreator(new PacketHtmlHanderCreator(new PacketBodyCreator())); 5 6 System.out.println(packetCreator.handleContent()); 7 8 } 9 10 }
JDK中的OutPutStread和InPutStream的类族就是装饰者模式的典型应用,通过嵌套方式不断的将对象聚合起来,最终形成一个超级对象,使之拥有所以相关子对象的功能。