文档章节

装饰者模式

铁骨铮铮
 铁骨铮铮
发布于 05/23 18:22
字数 860
阅读 5
收藏 0

 代理模式与装饰者模式看起来很像,都实现基础对象实现的接口,在其自身对象中都保存着对被代理/被装饰者的对象引用
  先来看看装饰者模式的定义:动态的将责任附加到被装饰者对象上,用于扩展对象的功能。比继承的灵活性大。典型的如Java IO的设计即是装饰者模式的典型应用。
  代理模式模式的定义:对其他对象进行代理,以控制对被代理对象的访问。Spring的为业务逻辑层方法生成的代理类,主要进行一些事务控制等。
  由定义可以看出装饰的责任是扩展功能 ,而代理主要控制访问。

 

什么是装饰模式

继承和装饰者模式都是一种对基本功能的拓展,装饰者模式比继承更加的灵活。前提是被装饰的类要实现了某个接口。

简单实现

拿一开始说的那个人为例子。人是个抽象的概念。男孩是个具体的人。但是这个人要干不同的事情要穿不一样的衣服,就需要进行不同的包装。

抽象的人:

public abstract class Person {
    public abstract void dress();
}

 

具体的人,也是原始的人,被装饰者

public class Boy extends Person {
    @Override
    public void dress() {
        System.out.println("穿内衣内裤");
    }
}

抽象的装饰者:

public abstract class PersonDecorator {
    Person person;

    public PersonDecorator(Person person) {
        this.person = person;
    }

    public void dress(){
        person.dress();
    }
}

工作人装饰者:

public class WorkPersonDecorator extends PersonDecorator {
    public WorkPersonDecorator(Person person) {
        super(person);
    }

    @Override
    public void dress() {
        super.dress();
        dressWork();
    }

    private void dressWork(){
        System.out.println("穿西装领带");
    }
}

运动的人装饰者:

public class SportPersonDecorator extends PersonDecorator {
    public SportPersonDecorator(Person person) {
        super(person);
    }

    @Override
    public void dress() {
        super.dress();
        dressSport();
    }
    private void dressSport(){
        System.out.println("穿运动衣");
    }
}

客户端调用:

public class Client {
    public static void main(String[] args) {
        Person boy = new Boy();
        
        System.out.println("包装一个上班人:");
        WorkPersonDecorator workPersonDecorator = new WorkPersonDecorator(boy);
        workPersonDecorator.dress();
        
        System.out.println("包装一个运动的人:");
        SportPersonDecorator sportPersonDecorator = new SportPersonDecorator(boy);
        sportPersonDecorator.dress();
    }
}

总结

装饰模式和前面的代理模式有点类似,容易把装饰模式看成代理模式。装饰模式是继承的一种替代方案,主要为所装饰的对象增强功能,动态的增加方法。而代理模式主要是为了控制对原有对象的访问权限,不对原有对象进行功能增强。

我觉得两者的区别主要是使用目的的区别。

优点

是继承的一种替代方案,但是比继承要灵活的多,可以在运行时通过传入不同的被装饰器或不同的装饰器来达成不同的行为。 增加新的被装饰类和装饰类很方便,而且不用修改原有代码。便于拓展。符合开闭原则。

缺点

设计模式基本都有这个缺点,就是会生成额外的类,增加系统复杂度。 由于装饰可以层层包装,交叉包装,如果包装的很深的话,调试排错会比较麻烦,也不容易理解。

 

© 著作权归作者所有

铁骨铮铮
粉丝 0
博文 26
码字总数 14039
作品 0
东城
私信 提问
设计模式——装饰者模式:婚纱照收费的简单实现

装饰者模式 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 装饰者模式特点 装饰者和被装饰对象有相同的超类型...

OSC一霸
2016/10/20
3K
12
”万丈高楼平地起“——如何从“建筑师”角度打造【装饰者设计模式】

写在前面:设计模式源于生活,而又高于生活! 什么是装饰者模式 在不改变原有对象的基础上附加功能,相比生成子类更灵活。 装饰者模式应用场景 过滤器,网关控制,P2P分控审批 装饰者模式类图...

须臾之余
05/15
0
0
Head First Design Pattern 读书笔记(3)装饰者模式

Head First Design Pattern 读书笔记(3) Decorator Pattern 装饰者模式 Decorator Pattern 类图 ![装饰者模式类图][2] 定义 装饰者模式:通过让组件类与装饰者类实现相同的接口,装饰类可以...

Tek_Eternal
2015/01/03
0
0
Decorator 装饰者模式

动机 我们可以通过继承来静态地(在编译期间)扩展对象的功能,不过有时我们也需要在使用对象的时候动态地(在运行时)扩展它 。 我来看一个经典的例子,图形窗口。比如说我们要扩展这个图形...

holysu
2017/11/26
0
0
Pattern-No.05 设计模式之装饰者模式

1、装饰者模式定义:动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为。 2、要点 具体被...

蓝汀华韶
2015/04/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java的线程同步和并发问题示例

并发问题 多线程是一个非常强大的工具,它使我们能够更好地利用系统的资源,但我们需要在读取和写入多个线程共享的数据时特别小心。 当多个线程尝试同时读取和写入共享数据时,会出现两种类型...

hiuh
58分钟前
1
0
Spring Boot 常用注解说明

实体类 @Entity (实体类注解) @Table(可指定表名) @Data(可缺省get/set) @Id (指定属性主键) @GeneratedValue(指定主键生成规则)

兜兜毛毛
今天
3
0
局域网能互相ping通,ubuntu虚拟机不能上外网

【问题】 桥接模式老是无法上网,查看本机IP发现被分配了一个私网地址,猜测应该是虚拟DHCP服务器没有打开,于是查看Ubuntu的网络配置: /etc/network/interfaces 发现没有dhcp配置的信息,只...

tahiti_aa
今天
2
0
以太坊助记词PHP开发包简介

以太坊助记词PHP开发包用来为PHP以太坊应用增加助记词和层级确定密钥支持能力。下载地址:以太坊助记词php开发包 。 1、开发包概述 以太坊助记词PHP开发包主要包括以下特性: 生成符合BIP39...

汇智网教程
昨天
2
0
系统监控-分布式调用链Skywalking

1. 为什么要使用分布式调用链技术? 随着公司业务的高速发展,公司服务之间的调用关系愈加复杂,如何理清并跟踪它们之间的调用关系就显的比较关键。线上每一个请求会经过多个业务系统,并产生...

秋日芒草
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部