设计模式:装饰模式特点、与继承比较分析总结

目录

一、装饰模式简介

二、装饰模式的角色

三、装饰模式编码实现

四、装饰模式与继承的比较

五、装饰模式应用场景


一、装饰模式简介

装饰模式(Decorator)又名装饰者模式模式。

什么是装饰模式?装饰模式有哪些 特点?

1、动态的将责任附加到对象上,若要扩展功能,装饰者提供比继承更具弹性的替代方案。

2、装饰模式以对客户透明的方式动态的给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。

3、装饰模式可以在不创造更多子类的情况下、将对象的功能加以扩展。

4、装饰模式把客户端的调用委派到被装饰类。装饰模式的关键在于这种扩展完全是透明的。

5、装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实 对象。

6、装饰对象和真实对象有相同的接口,装饰对象包含一个真实对象的引用,负责将请求转发给真实的对象。

7、装饰对象可以在转发这些请求前后增加一些附加自定义功能。

 

二、装饰模式的角色

·抽象构件角色(Component) :给出一个抽象接口,以规范准备接收附加责任的对象。
·具体构件角色(Concrete Component) :定义一个将要接收附加责任的类。
·装饰角色(Decorator) :持有一个构件(Component)对象的引用,并定义一个与抽象构件接口一致的接口
·具体装饰角色(Concrete Decorator) :负责给构件对象“贴上”附加的责任。

三、装饰模式编码实现

package sjms.pattern.decorator;

/**
 * Description:
 * User: zhurong
 * Date: 2018-10-24  21:51
 */
public interface Component {
    void helloWorld();
}
package sjms.pattern.decorator;

/**
 * Description:
 * User: zhurong
 * Date: 2018-10-24  22:07
 */
public class ConcreateComponent implements Component {
    @Override
    public void helloWorld() {
        System.out.println("ConcreateComponent");
    }
}
package sjms.pattern.decorator;

/**
 * Description:
 * User: zhurong
 * Date: 2018-10-24  21:52
 */
public class Decorator implements Component {
    private Component component;

    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public void helloWorld() {
        component.helloWorld();
    }
}
package sjms.pattern.decorator;

/**
 * Description:
 * User: zhurong
 * Date: 2018-10-24  21:53
 */
public class ConcreateDecorator1 extends Decorator {

    public ConcreateDecorator1(Component component) {
        super(component);
    }

    @Override
    public void helloWorld() {
        super.helloWorld();
        this.doOtherThing();
    }

    private void doOtherThing() {
        System.out.println("功能1");
    }
}
package sjms.pattern.decorator;

/**
 * Description:
 * User: zhurong
 * Date: 2018-10-24  21:53
 */
public class ConcreateDecorator2 extends Decorator {

    public ConcreateDecorator2(Component component) {
        super(component);
    }

    @Override
    public void helloWorld() {
        super.helloWorld();
        this.doOtherThing();
    }

    private void doOtherThing() {
        System.out.println("功能2");
    }
}
package sjms.pattern.decorator;

/**
 * Description:
 * User: zhurong
 * Date: 2018-10-24  21:53
 */
public class ConcreateDecorator3 extends Decorator {

    public ConcreateDecorator3(Component component) {
        super(component);
    }

    @Override
    public void helloWorld() {
        super.helloWorld();
        this.doOtherThing();
    }

    private void doOtherThing() {
        System.out.println("功能3");
    }
}
package sjms.pattern.decorator;

/**
 * Description:
 * User: zhurong
 * Date: 2018-10-24  22:00
 */
public class Client {

    public static void main(String[] args) {
        Component component = new ConcreateDecorator3(
                new ConcreateDecorator2(
                        new ConcreateDecorator1(new ConcreateComponent())));

        component.helloWorld();
    }


}

四、装饰模式与继承的比较

三、装饰模式和继承有啥不同 
1、装饰模式:
   (1)、用来扩展特定对象的功能。
   (2)、不需要子类。
   (3)、动态,运行时分配职责。灵活。
   (4)、一个给定的对象,同时可能有不同的装饰对象。
2、继承
    (1)、用来扩展一类对象的功能
    (2)、不需要子类
    (3)、静态
    (4)、编译的时候分配职责,缺乏灵活。
    (5)、导致很多子类产生,混杂。

 

五、装饰模式应用场景

1、Java的1O库提供了一个称做链接的机制,可以将一个流与另一个流首尾相接,形成一个流管道的链接。
这种机制实际上是一种被称为Decorator(装饰)设计模式的应用。
2、通过流的链接,可以动态的增加流的功能,而这种功能的增加是通过组合一些流的基本功能而动态获取的。
我们要获取一个1/O对象,往往需要产生多个/O对象,这也是Java 1/0库不太容易掌握的原因,但在1O库中
Decorator模式的运用,给我们提供了实现上的灵活性。

I/O 系统用了哪些设计模式?为什么要这么做?

装饰模式保持io体系功能健全的同时避免了更多子类产生。

 

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值