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

    Reader.class
    package com.bjpowernode.decorator;
    
    public interface Reader {
        
        void close();
        
    }

    FileReader 

    package com.bjpowernode.decorator;
    
    /**
     * 装饰者模式中的被装饰者
     */
    public class FileReader implements Reader{
    
        /**
         * 被装饰的方法
         */
        public void close(){
            System.out.println("FileReader is closed!");
        }
        
    }

    被装饰者BufferedReader 

    package com.bjpowernode.decorator;
    
    
    /**
     * 装饰者模式中的装饰者
     */
    public class BufferedReader implements Reader{
        
        //在装饰者中有一个被装饰者的引用
        //private FileReader reader; //这种固定的装饰,只能装饰这一种具体的类型。扩展性差。
        
        //这样可以装饰Reader类型的所有子类型。
        private Reader reader;
        
        
        //创建装饰者对象的构造函数
        /*
        public BufferedReader(FileReader reader){
            this.reader = reader;
        }
        */
        
        public BufferedReader(Reader reader){
            this.reader = reader;
        }
        
        //装饰者和被装饰者应该具有相同的行为。
        //我们希望在使用装饰者的时候就像在使用被装饰者。不被用户所察觉,用户还是以为他在使用“被装饰者对象”。
        public void close(){
            
            System.out.println("低耦合扩展代码1");
            
            //装饰者模式中并没有控制“被装饰者”,一直强调的是装饰,没有修改,没有控制。
            reader.close();
            
            System.out.println("低耦合扩展代码2");
        }
    }

    Test 

    package com.bjpowernode.decorator;
    
    /**
     *    1、装饰者设计模式主要解决的问题是:
     *        “低耦合”的对被装饰者的功能“扩展”,
     *        不是修改、不是控制。所谓的扩展就是在原先的代码基础之上添加程序。 
     */
    public class Test {
    
        public static void main(String[] args) {
            
            //创建被装饰者对象
            FileReader reader = new FileReader();
            
            //创建装饰者对象
            //BufferedReader br = new BufferedReader(reader);
            Reader br = new BufferedReader(reader);
            
            //通过调用装饰者中的装饰方法对被装饰者进行装饰。这个过程就是一个功能扩展。
            br.close();
            
        }
    
    }
     
  • 相关阅读:
    request和request.form和request.querystring的区别
    PL/SQL Developer连接64位Oracle
    C# Winform控件对透明图片重叠时导致图片不透明的解决方法
    C++11多线程编程-两个进程轮流打印1~100
    使用 C++11 并发编程入门
    STL vector动态扩容
    GDB入门教程
    统计整数中1的个数
    gulp的使用
    nvm安装教程
  • 原文地址:https://www.cnblogs.com/yangyanbo/p/12370100.html
Copyright © 2011-2022 走看看