zoukankan      html  css  js  c++  java
  • java设计模式之装饰者模式学习

    装饰者模式

    Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案。

    装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为

    比如现在有个方法,是过滤文字的方法

    1.接口:

    package com.qiao.wrapper;
    
    public interface MessageBoardHandler {
        public String filter(String msg);
    }

    2.继承者

    package com.qiao.wrapper;
    
    public class MessageBoard implements MessageBoardHandler{
    
        public String filter(String msg) {
            return "处理留言板上的内容:"+msg;
        }
    
    }

    3.调用

    @Test
    public void test4(){
      MessageBoardHandler hanlder = new MessageBoard();
      String msg = hanlder.filter("<a>hello</a>");
      System.out.println(msg);
    }

    控制台输出

     

    现在我有个需求,我想把留言板里面的标签都给过滤了,但是我又不想把原有的方法改变。

    这时,一个方法就是,在方法外面再包裹一层

    1.写一个包装类,也实现MessageBoardHandler这个接口

    package com.qiao.wrapper;
    
    public abstract class MessageBoardDecorator implements MessageBoardHandler{
    
        private MessageBoardHandler handler;
        
        public MessageBoardDecorator(MessageBoardHandler hanlder){
            this.handler=hanlder;
        }
        
        public String filter(String msg) {
            return this.handler.filter(msg);
        }
    
    }

    2.再写个html标签过滤的类,继承这个包装类

    package com.qiao.wrapper;
    
    public class HtmlFilter extends MessageBoardDecorator {
    
        private MessageBoardHandler hanlder;
        
        public HtmlFilter(MessageBoardHandler hanlder) {
            super(hanlder);
            this.hanlder=hanlder;
        }
        
        public String filter(String msg){
            String temp = this.hanlder.filter(msg);
            temp+=" ^^^Filter html tag";
            return temp;
        }
    
    }

    3.调用

        @Test
        public void test5(){
            MessageBoardDecorator dec = new HtmlFilter(new MessageBoard());
            String msg = dec.filter("<a>hello</a>");
            System.out.println(msg);
        }

     输出

    加入我现在不想过滤html标签了,我想过滤一些敏感词了,这是我只要在原有的方法上包装另一个方法即可

    package com.qiao.wrapper;
    
    public class SensitiveFilter extends MessageBoardDecorator {
    
        private MessageBoardHandler hanlder;
        
        public SensitiveFilter(MessageBoardHandler hanlder) {
            super(hanlder);
            this.hanlder = hanlder;
        }
    
        public String filter(String msg){
            String temp = this.hanlder.filter(msg);
            temp += " filter sensitive words ";
            return temp;
        }
    }

     调用,

        @Test
        public void test6(){
            MessageBoardDecorator dec = new SensitiveFilter(new MessageBoard());
            String msg = dec.filter("<a>hello</a>");
            System.out.println(msg);
        }

    输出

      处理留言板上的内容:<a>hello</a> filter sensitive words

    个人理解,其实就是在原有方法上包装一层方法,达到自己的目的,其中在java的io中就大量运用了包装者模式

  • 相关阅读:
    HTML DOM 06 节点关系
    HTML DOM 05 事件(三)
    HTML DOM 05 事件(二)
    HTML DOM 05 事件(一)
    html DOM 04 样式
    html DOM 03 节点的属性
    html DOM 02 获取节点
    html DOM 01 节点概念
    JavaScript 29 计时器
    JavaScript 28 弹出框
  • 原文地址:https://www.cnblogs.com/Iqiaoxun/p/5565128.html
Copyright © 2011-2022 走看看