zoukankan      html  css  js  c++  java
  • 装饰器模式(学习笔记10)

    原文:http://c.biancheng.net/view/1366.html

    什么时候用:

    1. 当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。例如,该类被隐藏或者该类是终极类或者采用继承方式会产生大量的子类。
    2. 当需要通过对现有的一组基本功能进行排列组合而产生非常多的功能时,采用继承关系很难实现,而采用装饰器模式却很好实现。
    3. 当对象的功能要求可以动态地添加,也可以再动态地撤销时。

    装饰器模式主要包含以下角色:

    1. 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
    2. 具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
    3. 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
    4. 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

    结构图:

    image

    示例代码:

    package decorator;
    
    public class DecoratorPattern {
        public static void main(String[] args) {
            Component p = new ConcreteComponent();
            p.operation();
            System.out.println("---------------------------------");
            Component d = new ConcreteDecorator(p);
            d.operation();
        }
    }
    
    //抽象构件角色
    interface Component {
        public void operation();
    }
    
    //具体构件角色
    class ConcreteComponent implements Component {
        public ConcreteComponent() {
            System.out.println("创建具体构件角色");
        }
    
        public void operation() {
            System.out.println("调用具体构件角色的方法operation()");
        }
    }
    
    //抽象装饰角色
    class Decorator implements Component {
        private Component component;
    
        public Decorator(Component component) {
            this.component = component;
        }
    
        public void operation() {
            component.operation();
        }
    }
    
    //具体装饰角色
    class ConcreteDecorator extends Decorator {
        public ConcreteDecorator(Component component) {
            super(component);
        }
    
        public void operation() {
            super.operation();
            addedFunction();
        }
    
        public void addedFunction() {
            System.out.println("为具体构件角色增加额外的功能addedFunction()");
        }
    }
  • 相关阅读:
    XHR——XMLHttpRequest对象
    原生JS弹出层详解,从简单到复杂
    php面向对象(OOP)编程完全教程
    css hack
    Ajax+php 详细分析 (没完整)
    Zend Studio 12 生成 WSDL
    PHP WebService/Soap接口生成方法。
    php soap客户端调试实例及调试
    简单数据结构之栈模拟
    经典算法之约瑟夫问题
  • 原文地址:https://www.cnblogs.com/huiy/p/15566819.html
Copyright © 2011-2022 走看看