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中就大量运用了包装者模式

  • 相关阅读:
    C++11中静态局部变量初始化的线程安全性
    213. 打家劫舍 II
    cas解决aba相关问题
    socket[可读可写异常]3种条件的发生
    linux信号处理 (信号产生 信号阻塞 信号集)
    vim set paste解决粘贴乱序乱码问题
    174. 地下城游戏
    208. 实现 Trie (前缀树) 和 面试题 17.13. 恢复空格
    Centos安装和卸载docker
    Go语言轻量级框架-Gin与入门小案例MySQL增删查改
  • 原文地址:https://www.cnblogs.com/Iqiaoxun/p/5565128.html
Copyright © 2011-2022 走看看