装饰者模式 Decorator Pattern

作用:动态地给一个对象添加一些额外的职责。就增加功能来说, Decorator模式相比生成子类更为灵活。装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任。

装饰模式的优点:

(1)装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。装饰模式允许系统动态决定“贴上”一个需要的“装饰”,或者除掉一个不需要的“装饰”。继承关系则不同,继承关系是静态的,它在系统运行前就决定了。
(2)通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

装饰模式的缺点:

由于使用装饰模式,可以比使用继承关系需要较少数目的类。使用较少的类,当然使设计比较易于进行。但是,在另一方面,使用装饰模式会产生比使用继承关系更多的对象。更多的对象会使得查错变得困难,特别是这些对象看上去都很相像。


实现案例:

1、首先定义一个抽象构件(Component)角色:

public interface IMessageHandler <T> {

    public Object createMessage(T request) throws Exception;

}

2、定义一个装饰(Decorator)角色:
其中定义一个本身的引用是重点

public class MessageHandlerDecorator implements IMessageHandler<Object>{

    /* 定义本身的引用 */
    protected MessageHandlerDecorator messageHandler;


    /*
     *  父类默认createMessage方法
     */
    @Override
    public Object createMessage(Object request) throws Exception {
        System.out.println("我是最初的createMessage功能");
        if(messageHandler != null){
            return messageHandler.createMessage(request);
        }
        return new Object();
    }

    
    public MessageHandlerDecorator getMessageHandlerDecorator() {
        return messageHandler;
    }

    public void setMessageHandlerDecorator(MessageHandlerDecorator messageHandler) {
        this.messageHandler = messageHandler;
    }
    
}

3、定义多个具体装饰(ConcreteDecorator)角色(负责给构件对象“贴上”附加的责任,既在装饰角色及基础上增加额外的功能):

A_MessageHandler.java
public class A_MessageHandler extends MessageHandlerDecorator {


    /*
     *  扩展类 A_MessageHandler 的createMessage方法
     */
    @Override
    public Object createMessage(Object request) throws Exception {
        /* 先执行父类的功能 */
        Object result = super.createMessage(request);

        System.out.println("执行该子类的附加指责");
        // ... result   对result结果再进行额外的 A 加工;
        
        return result;

    }
}

B_MessageHandler.java
public class B_MessageHandler extends MessageHandlerDecorator {


    /*
     *  扩展类 B_MessageHandler 的createMessage方法
     */
    @Override
    public Object createMessage(Object request) throws Exception {
        /* 先执行父类的功能 */
        Object result = super.createMessage(request);

        System.out.println("执行该子类的附加指责");
        // ... result   对result结果再进行额外的 B 加工;

        return result;

    }
}

C_MessageHandler.java
public class C_MessageHandler extends MessageHandlerDecorator {

    /*
     *  扩展类 C_MessageHandler 的createMessage方法
     */
    @Override
    public Object createMessage(Object request) throws Exception {
        /* 该方法需要借助 B 加工的结果 */
        this.messageHandler = new B_MessageHandler();
        Object result = super.createMessage(request);

        System.out.println("执行该子类的附加指责");
        // ... result   对result结果再进行额外的 C 加工;

        return result;


    }
}

通常我们可以把这多个具体的装饰角色交由工厂进行管理,如使用MapFactoryBean管理,此处不再赘述。

猜你喜欢

转载自blog.csdn.net/qq_33404395/article/details/83306150