浅谈JAVA设计模式之——装饰模式(Decorator)

来源:互联网 发布:数据离散程度的指标 编辑:程序博客网 时间:2024/06/05 20:24
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45464445

一、概述

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

二、适用性

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

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

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

三、参与者

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

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

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

4.ConcreteDecorator 向组件添加职责。

四、类图

五、示例

Component

package com.lyz.design.decorator;/** * 定义Component接口Person * @author liuyazhuang * */public interface Person {    void eat();}

ConcreteComponent

package com.lyz.design.decorator;/** * Person接口的实现类Man * @author liuyazhuang * */public class Man implements Person {public void eat() {System.out.println("男人在吃");}}

Decorator

package com.lyz.design.decorator;/** * Decorator抽象类实现Person接口 * @author liuyazhuang * */public abstract class Decorator implements Person {    protected Person person;        public void setPerson(Person person) {        this.person = person;    }        public void eat() {        person.eat();    }}

ConcreteDecorator

package com.lyz.design.decorator;/** * Decorator的子类 * @author liuyazhuang * */public class ManDecoratorA extends Decorator {    public void eat() {        super.eat();        reEat();        System.out.println("ManDecoratorA类");    }    public void reEat() {        System.out.println("再吃一顿饭");    }}

package com.lyz.design.decorator;/** * Decorator的子类 * @author liuyazhuang * */public class ManDecoratorB extends Decorator {        public void eat() {        super.eat();        System.out.println("===============");        System.out.println("ManDecoratorB类");    }}

Test

package com.lyz.design.decorator;/** * 测试类 * @author liuyazhuang * */public class Test {    public static void main(String[] args) {        Man man = new Man();        ManDecoratorA md1 = new ManDecoratorA();        ManDecoratorB md2 = new ManDecoratorB();                md1.setPerson(man);        md2.setPerson(md1);        md2.eat();    }}

result
男人在吃再吃一顿饭ManDecoratorA类===============ManDecoratorB类


0 0
原创粉丝点击