java设计模式(结构型)之装饰模式

来源:互联网 发布:趣学python编程中文版 编辑:程序博客网 时间:2024/06/11 11:48

第0章:简介

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

装饰模式本质:动态组合

参考:http://chjavach.iteye.com/blog/767739  ,研磨设计模式(书籍),大话设计模式(书籍)

模式图:

待补充


第1章:实践

(1)组件对象的接口(Component.java)

package com.mcc.core.designPattern.structure.decorator;

/**
 * 组件对象的接口,可以给这些对象动态地添加职责
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-13  下午11:44
 */
public abstract class Component {

    public abstract void someMethod();
}

(2)组件对象接口的具体实现对象A(ComponentExtendsA)

package com.mcc.core.designPattern.structure.decorator;

/**
 * 组件对象接口的具体实现对象A,被装饰的对象
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-13  下午11:50
 */
public class ComponentExtendsA extends Component {
    @Override
    public void someMethod() {
        System.out.println("组件对象具体实现对象A的方法");
    }
}

(3)组件对象接口的具体实现对象B(ComponentExtendsB.java)

package com.mcc.core.designPattern.structure.decorator;

/**
 * 组件对象接口的具体实现对象B,被装饰的对象
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-13  下午11:54
 */
public class ComponentExtendsB extends Component {
    @Override
    public void someMethod() {
        System.out.println("组件对象具体实现对象B的方法");
    }
}

(4)装饰器的接口(Decorator.java)

package com.mcc.core.designPattern.structure.decorator;

/**
 * 装饰器的接口,维持一个指向组件对象的接口对象,自身也是组件对象的子类
 *
 * 装饰模式的定义:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活
 * 装饰模式的本质:动态组合
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-13  下午11:55
 */
public abstract class Decorator extends Component {

    //持有组件对象
    protected Component component;

    /**
     * 构造器,传入组件对象,对象来自装饰器具体实现对象
     * @param component
     */
    public Decorator(Component component){
        this.component = component;
    }

    @Override
    public void someMethod(){
        System.out.println("转发前可以附加操作");
        //转发请求给组件对象
        component.someMethod();
        System.out.println("转发后可以附加操作");
    }

}

(5)装饰器具体实现类A(DecoratorExtendsA.java)

package com.mcc.core.designPattern.structure.decorator;

/**
 * 装饰器具体实现类A
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-14  上午12:05
 */
public class DecoratorExtendsA extends Decorator {
    /**
     * 构造器,传入组件对象,对象来自装饰器具体实现对象
     *
     * @param component
     */
    public DecoratorExtendsA(Component component) {
        super(component);
    }

    @Override
    public void someMethod() {
        System.out.println("装饰器A调用父类方法前操作");
        //调用方法,这里可以向组件对象添加职责
        super.someMethod();
        System.out.println("装饰器A调用父类方法后操作");
    }
}

(6)装饰器具体实现类B(DecoratorExtendsB.java)

package com.mcc.core.designPattern.structure.decorator;

/**
 * 装饰器具体实现类B
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-14  上午12:10
 */
public class DecoratorExtendsB extends Decorator {
    /**
     * 构造器,传入组件对象,对象来自装饰器具体实现对象
     *
     * @param component
     */
    public DecoratorExtendsB(Component component) {
        super(component);
    }

    @Override
    public void someMethod() {
        System.out.println("装饰器B调用父类方法前操作");
        //调用方法,这里可以向组件对象添加职责
        super.someMethod();
        System.out.println("装饰器B调用父类方法后操作");
    }
}

(7)客户端测试(Client.java)

package com.mcc.core.designPattern.structure.decorator;

/**
 * 客户端测试
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-14  上午12:15
 */
public class Client {

    public static void main(String args[]){
        //被装饰的对象
        Component componentA = new ComponentExtendsA();
        Component componentB = new ComponentExtendsB();

        System.out.println("\n装饰器A装饰被装饰对象A:\n");
        Decorator decoratorAA = new DecoratorExtendsA(componentA);
        decoratorAA.someMethod();

        System.out.println("\n装饰器A装饰被装饰对象B:\n");
        Decorator decoratorAB = new DecoratorExtendsA(componentB);
        decoratorAB.someMethod();

        System.out.println("\n装饰器B装饰被装饰对象A:\n");
        Decorator decoratorBA = new DecoratorExtendsB(componentA);
        decoratorBA.someMethod();

        System.out.println("\n装饰器B装饰被装饰对象B:\n");
        Decorator decoratorBB = new DecoratorExtendsB(componentB);
        decoratorBB.someMethod();

    }
}


0 0
原创粉丝点击