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的类族就是装饰者模式的典型应用,通过嵌套方式不断的将对象聚合起来,最终形成一个超级对象,使之拥有所以相关子对象的功能。

posted @ 2015-12-16 00:12  ngulc  阅读(415)  评论(0编辑  收藏  举报