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

    装饰模式(别名:包装器):动态的给对象添加一些额外的职责。就功能来说装饰模式相比生成子类更为灵活。

    概述

    许多时候,我们需要改进某个对象的功能。例如麻雀类的实例能连续飞行100米,如果用麻雀类创建了5个麻雀,想让其中一只飞行150米,在不修改麻雀类的代码前提下,怎么做?

    装饰模式是动态地扩展一个对象的功能,而不需要修改原始类代码。“具体组件”类和“具体装饰”类是该模式下两个重要角色。“具体组件”类的实例称为“被装饰者”,“具体装饰”类的实例称为“装饰者”。“具体装饰”类需要包含有“具体组件”类的一个实例的引用,以便装饰“被装饰者”。

    模式的结构

    抽象组件:一个抽象类,定义“被装饰者”需要装饰的方法。

    具体组件:抽象组件的子类,具体组件的实例称为“被装饰者”。

    装饰:抽象组件的一个子类,此外还包含一个抽象组件声明的变量以保存“被装饰者”的引用。装饰可以是抽象类,也可以是非抽象类。

    具体装饰:装饰的一个非抽象子类,称为“装饰者”。

    模式的使用

    抽象组件:Bird.java

    /**
     * 抽象组件
     */
    public abstract class Bird {
        public abstract int fly();
    }
    

     具体组件:Sparrow.java

    /**
     * 具体组件
     */
    public class Sparrow extends Bird {
        public final int DISTANCE=100;
        public int fly(){
            return DISTANCE;
        }
    }
    

     装饰:Decorator.java

    /**
     * 装饰
     */
    public abstract class Decorator extends Bird{
        protected Bird bird;
        public Decorator(){};
        public Decorator(Bird bird){
            this.bird=bird;
        }
    }
    

     具体装饰:SparrowDecorator.java

    /**
     * 具体装饰
     */
    public class SparrowDecorator extends Decorator{
        public final int DISTANCE=50;
        SparrowDecorator(Bird bird){
            super(bird);
        }
        public int fly(){
            int distance =0;
            distance = bird.fly()+addFly();
            return  distance;
        }
        private int addFly(){
            return DISTANCE;
        }
    }
    

     应用程序:Application.java

    /**
     * 应用程序
     */
    public class Application {
        public static void  main(String[] args){
            Bird sparrow = new Sparrow();
            Bird sparrowDecorator = new SparrowDecorator(sparrow);
            int distance = sparrowDecorator.fly();
            System.out.println("这只鸟飞行了"+distance+"米");
        }
    }
    

     装饰模式的优点

    • 被装饰者和装饰者是松耦合关系。
    • 满足“开-闭原则”。不必修改具体组件,就可以增加新的针对该具体组件的具体装饰。
    • 可以使用多个具体装饰来装饰具体组件的实例

     装饰模式的使用场景

    • 程序希望动态的增强类的某个对象的功能,而不影响到该类的其他对象。
    • 采用继承来增强对象功能不利于系统的扩展和维护

     Java IO与装饰模式

    java.io包中的类使用了装饰模式。

    比如,Reader类相当于“抽象组件”,FileReader类相当于具体组件,BufferReader类相当于装饰。

  • 相关阅读:
    gulp中glob的匹配规则
    ES6————let和const命令
    location
    section,div,artical的区别
    Mysql基本语法
    Nodejs基础中间件Connect
    springMVC结合Jcrop实现头像上传裁剪预览功能--javaweb修订版
    Nodejs Express 4.X 中文API 4--- Router篇
    Nodejs Express 4.X 中文API 3--- Response篇
    Nodejs Express 4.X 中文API 2--- Request篇
  • 原文地址:https://www.cnblogs.com/wuchaodzxx/p/6758599.html
Copyright © 2011-2022 走看看