zoukankan      html  css  js  c++  java
  • 浅谈Java设计模式——装饰模式(Decorator)

    一、概述

            动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

    二、使用场景

    1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 

    2.处理那些可以撤消的职责。 

    3.当不能采用生成子类的方法进行扩充时。

    三、参与者

    1.Component 定义一个对象接口,可以给这些对象动态地添加职责。 

    2.ConcreteComponent 定义一个对象,可以给这个对象添加一些职责。

    3.Decorator 维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。 

    4.ConcreteDecorator 就是具体的装饰对象,起到该Component添加职责的功能。

    四、类图

    五、代码示例

    1.Component接口:

    /**
     * 定义Component接口Person
     * @author zhipeng_Tong
     */
    public interface Person {
        void speak();
    }

    2.ConcreteComponent:

    /**
     * ConcreteComponent类,即Person的实现类
     * @author zhipeng_Tong
     */
    public class Speaker implements Person {
        @Override
        public void speak() {
            System.out.println("时光的荏苒");
        }
    }

    3.Decorator抽象类:

    /**
     * Decorator抽象类,实现了(Component接口的)Person
     * @author zhipeng_Tong
     */
    public abstract class Decorator implements Person {
        protected Person person;
    
        public void setPerson(Person person) {
            this.person = person;
        }
    
        @Override
        public void speak() {
            if (person != null)
                person.speak();
        }
    }

    4.ConcreteDecorator装饰类:

    public class ConcreteDecoratorA extends Decorator {
        @Override
        public void speak() {
            super.speak();
            seconedSpeak();
            System.out.println("ConcreteDecoratorA...Over");
        }
    
        private void seconedSpeak() {
            System.out.println("它蹉跎了所有");
        }
    }
    

    public class ConcreteDecoratorB extends Decorator {
        @Override
        public void speak() {
            super.speak();
            seconedSpeak();
            System.out.println("ConcreteDecoratorB...Over");
        }
    
        private void seconedSpeak() {
            System.out.println("他向我...");
        }
    }

    5.测试代码

    public class Client {
        public static void main(String[] args) {
            Speaker speaker = new Speaker();
            ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA();
            ConcreteDecoratorB concreteDecoratorB = new ConcreteDecoratorB();
    
            concreteDecoratorA.setPerson(speaker);
            concreteDecoratorB.setPerson(concreteDecoratorA);
            concreteDecoratorB.speak();
        }
    }

    运行结果:

    时光的荏苒
    它蹉跎了所有
    ConcreteDecoratorA...Over
    他向我...
    ConcreteDecoratorB...Over

  • 相关阅读:
    Nginx与Apache的对比
    gc buffer busy waits(ZT)
    Brocade SAN Switch Change Domain ID (ZT)
    Oracle异机恢复时报错ora19870 ora19507
    row cache lock (ZT)
    can a select block a truncate (ZT)
    NBU常用命令
    the RRD does not contain an RRA matching the chosen C
    Solaris10 x64安装64bit perl
    Solaris and Oracle 32bit Linking Error "fatal: symbol 'ntcontab'
  • 原文地址:https://www.cnblogs.com/IdealSpring/p/11871174.html
Copyright © 2011-2022 走看看