博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式——装饰模式详解
阅读量:4046 次
发布时间:2019-05-24

本文共 2265 字,大约阅读时间需要 7 分钟。

0. 前言  

写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦~本文原创,转载请注明出处为

装饰模式是结构型设计模式之一,使用一种对客户透明的方式来动态拓展对象的功能,Java IO中各种流的嵌套就是装饰模式的很好体现。

 

1. 装饰模式介绍

装饰模式定义:

动态地给一个对象添加一些额外的功能,比生成子类要灵活。

 

装饰模式的使用场景:

需要透明且动态地拓展类的功能的场景。

 

装饰模式包括的角色:

 

1)抽象组件Component类。

2)组件具体实现ConcreteComponent类。也是被装饰的对象

3)抽象装饰类Decorator内部持有一个组件对象的引用,职责就是装饰ConcreteComponent。之所以是抽象的,就是为了方便不同的装饰“风格”子类的自定义实现。

4)具体装饰类ConcreteDecorator

 

2.  装饰模式实例介绍

想到装饰,很容易想到一个人穿衣服,在不同的季节穿不同的衣服,比如夏天穿短裤、冬天穿毛裤,但是不管什么季节,内裤肯定是要穿的。

抽象组件Component类就可以是抽象类Person,而ConcreteComponent类就可以是具体的一个人Calvin,也是要被装饰的对象。抽象装饰类Decorator持有了Calvin的引用,并且回调了Calvin本身的一个“穿内裤”的行为,并且在具体的装饰类中,即“冬夏”两个类中,分别为主人公Calvin穿上了毛裤和短裤,为对象增加了额外的功能。代码也比较简单,如下所示。

/** * Decorator Pattern * Created by Calvin on 2017/5/10. */public class Decorator {    public static void main(String[] args) {        Person calvin = new Calvin();        PersonCloth summerCloth = new SummerCloth(calvin);        PersonCloth winterCloth = new WinterCloth(calvin);        summerCloth.dressed();        winterCloth.dressed();    }    public static abstract class Person{        public abstract void dressed();    }    public static class Calvin extends Person{        @Override        public void dressed() {            System.out.println("穿件内裤");        }    }    public static abstract class PersonCloth extends Person{        Person myPerson;        public PersonCloth(Person myPerson) {            this.myPerson = myPerson;        }        @Override        public void dressed() {            myPerson.dressed();        }    }    public static class SummerCloth extends PersonCloth{        public SummerCloth(Person myPerson) {            super(myPerson);        }        @Override        public void dressed() {            super.dressed();            System.out.println("穿件短裤");        }    }    public static class WinterCloth extends PersonCloth{        public WinterCloth(Person myPerson) {            super(myPerson);        }        @Override        public void dressed() {            super.dressed();            System.out.println("穿件毛裤");        }    }}

3.  装饰模式总结

装饰模式动态地给一个对象添加一些额外的功能,相对于继承的方式,更加灵活。

装饰模式经常被误认为是代理模式。装饰模式是以对客户透明的方式扩展对象的功能,是继承关系的一个替代方案。而代理模式则是给一个对象提供一个代理对象,并由代理对象来控制原有对象的引用

前者重在增加功能,后者重在对代理对象施加控制,不是对对象本身功能的增强。

你可能感兴趣的文章
hdu 3790 最短路径问题 最短路Dijkstra
查看>>
hrbust 1339 Touring 最短路Dijkstra 邻接表
查看>>
UVA 4855 Hyper Box 斐波那契
查看>>
UVA 4857 Halloween Costumes 区间背包
查看>>
poj 2955 Brackets 括号匹配 区间dp
查看>>
hdu 2082 找单词 母函数
查看>>
HLG 2057 字典树 map
查看>>
SimpleDateFormat使用详解 java
查看>>
poj 1860 Currency Exchange 3259 Wormholes bellman 判环
查看>>
poj 1062 昂贵的聘礼 最短路bellman
查看>>
linux环境变量(转载)
查看>>
C语言中strlen与sizeof的区别(`$~新年快乐~$`!)
查看>>
struct msghdr与struct iovec
查看>>
编译和解释的区别是什么?
查看>>
unpv1 Makefile 文件 简略分析
查看>>
linux网络编程 UDP聊天程序 包括群聊和私聊
查看>>
linux 网络编程 Tcp文件服务器
查看>>
有关send() / recv()函数的理解
查看>>
ping在类unix下的实现
查看>>
python下操作数据库
查看>>