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

  • 相关阅读:
    Ubuntu分区挂载
    YOLOv3:Demo needs OpenCV for webcam images
    tf.strided_slice函数
    numpy:np.random.seed()
    python:split()函数
    python:set() 函数
    python:zip() 函数
    python:enumerate 函数
    电脑无法上网,DNS出现fec0:0:0:ffff::1%1问题
    python:map 函数
  • 原文地址:https://www.cnblogs.com/lcngu/p/5049949.html
Copyright © 2011-2022 走看看