DercoratorPattern装饰者模式

装饰者模式

1,定义

动态的给一个对象添加一些额外的职责。

装饰者模式通常有4个角色,就增加功能来说,装饰者模式比生成子类更加的灵活。

Component:抽象构件。通常是一个接口或者抽象类,定义最核心最原始的对象。

public interface AbstractComponent {

    /**
     * 抽象方法
     */
    void operate();
}

ConcreteComponent:具体构件。抽象构件的实现,即被装饰的对象。

public class Component implements AbstractComponent {

    @Override
    public void operate() {
        System.out.println("do something!");
    }
}

Decorator:抽象装饰者角色。通常是一个抽象类,可设置一个被装饰对象。

public abstract class Decorator implements AbstractComponent {

    /** 定义一个装饰构件 **/
    private AbstractComponent abstractComponent;

    /**
     * 通过构造函数设置被装饰者
     * @param abstractComponent
     */
    public Decorator(AbstractComponent abstractComponent) {
        this.abstractComponent = abstractComponent;
    }

    /**
     * 委托被装饰着执行
     */
    @Override
    public void operate() {
        this.abstractComponent.operate();
    }
}

ConcreteDecorator:具体装饰者角色。实现对构件的功能职责的扩展。

public class DecoratorOne extends Decorator {

    /**
     * 通过构造函数设置被装饰者
     *
     * @param abstractComponent
     */
    public DecoratorOne(AbstractComponent abstractComponent) {
        super(abstractComponent);
    }

    /**
     * 定义自己的装饰方法
     */
    private void methodOne() {
        System.out.println("DecoratorOne.methodOne 装饰");
    }

    /**
     * 重写被装饰对象的方法
     */
    @Override
    public void operate() {
        this.methodOne();
        super.operate();
    }
}

public class DecoratorTwo extends Decorator {

    /**
     * 通过构造函数设置被装饰者
     *
     * @param abstractComponent
     */
    public DecoratorTwo(AbstractComponent abstractComponent) {
        super(abstractComponent);
    }

    /**
     * 定义自己的装饰方法
     */
    private void methodTwo() {
        System.out.println("DecoratorTwo.methodTwo 装饰");
    }

    /**
     * 重写被装饰对象的方法
     */
    @Override
    public void operate() {
        super.operate();
        this.methodTwo();
    }
}

场景类

public class Client {

    public static void main(String[] args) {
        /** 定义被装饰着 **/
        AbstractComponent component = new Component();

        /** 第一次装饰 **/
        component = new DecoratorOne(component);

        /** 第二次装饰 **/
        component = new DecoratorTwo(component);

        component.operate();
    }
}

2.应用

2.1 优点

  • 装饰者及被装饰者相互独立,两者解耦,提高系统的灵活性。
  • 装饰者模式是继承关系的替代方案,且不论被装饰多少层,返回的对象仍然是该被装饰者。
  • 装饰者模式可以动态的扩展一个实现类的功能。

2.2 缺点

  • 多层装饰会增加实现类的复杂度,减少装饰类的数量可以降低系统的复杂度。

2.3 使用场景

  • 动态的为一个对象增加功能,且可以动态的撤销。
  • 为一批实现类改装或加装功能。
(0)

相关推荐

  • 详解JAVA面向对象的设计模式 (七)、装饰模式

    装饰模式 Decorator 装饰模式比较简单,我就不单独写实现例子了.参考设计图去实现不是什么问题.建议可以写一写找找感觉. 在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修.相 ...

  • PHP设计模式之装饰器模式

    PHP设计模式之装饰器模式 工厂模式告一段落,我们来研究其他一些模式.不知道各位大佬有没有尝试过女装?据说女装大佬程序员很多哟.其实,今天的装饰器模式就和化妆这件事很像.相信如果有程序媛MM在的话,马 ...

  • 设计模式-结构型-装饰者模式

    装饰者模式(wrapper): 允许向一个现有的对象添加新的功能,同时又不改变其结构.装饰器模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能.使用对象的关联关系代替继承关系,更加 ...

  • 设计模式-装饰器模式

    装饰器模式 定义 装饰器模式也叫包装模式 在不改变原有对象的基础上,把功能附加到对象上,提供了比继承更有弹性的替代方案 能够扩展原有对象的功能 属于结构型模式 生活中的例子 买煎饼 我们煎饼可以加鸡蛋 ...

  • [PHP小课堂]PHP设计模式之装饰器模式

    [PHP小课堂]PHP设计模式之装饰器模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 3年工作必备 装饰器模式

    回复"000"获取大量电子书 大家好,我是老田,从今天开始,本公众号每周给大家送福利,送什么呢?肯定是技术书啦,没那么多花里胡哨的,参与方式见文末. 好啦,进入我们的主题,今天我给 ...

  • C#设计模式-装饰器模式(Decorator Pattern)

    引言 当我们完成一个软件产品开发后就需要对其进行各种测试,适配快速迭代下质量的保障.当有一个完善的产品的对象后,如果我们想要给他添加一个测试功能,那么我们可以用一个新的类去装饰它来实现对原有对象职责的 ...

  • PHP设计模式—装饰器模式

    定义: 装饰器模式(Decorator):动态的给一个对象添加一些额外的职责,就增加功能来说,装饰器比生成子类更加灵活. 结构: Component:定义一个对象接口,可以给这些对象动态地添加职责. ...

  • 结构型设计模式 - 装饰者模式详解

    基本定义 装饰者模式属于结构型模式,它可以动态的将新功能附加到对象上,同时又不改变其结构.在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(OCP). 模式结构 装饰者和被装饰者有相同 ...

  • 装饰者模式,从吃黄焖鸡开始说起

    黄焖鸡米饭最热卖的外卖之一,国人都喜欢吃,吃过黄焖鸡米饭的应该都知道,除了黄焖鸡米饭主体外,还可以添加各种配菜,如土豆.香菇.鹌鹑蛋.青菜等.如果需要你来设计一套黄焖鸡米饭结账系统,你该如何设计呢? ...