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类相当于装饰。

  • 相关阅读:
    hihoCoder #1062 : 最近公共祖先·一
    hihoCoder #1050 : 树中的最长路
    hihoCoder #1049 : 后序遍历
    108 Convert Sorted Array to Binary Search Tree 将有序数组转换为二叉搜索树
    107 Binary Tree Level Order Traversal II 二叉树的层次遍历 II
    106 Construct Binary Tree from Inorder and Postorder Traversal 从中序与后序遍历序列构造二叉树
    105 Construct Binary Tree from Preorder and Inorder Traversal 从前序与中序遍历序列构造二叉树
    104 Maximum Depth of Binary Tree 二叉树的最大深度
    102 Binary Tree Level Order Traversal 二叉树的层次遍历
    101 Symmetric Tree 判断一颗二叉树是否是镜像二叉树
  • 原文地址:https://www.cnblogs.com/wuchaodzxx/p/6758599.html
Copyright © 2011-2022 走看看