装饰器模式,顾名思义,就是在一个类上增加功能,以起到装饰的作用。
创新互联企业建站,10年网站建设经验,专注于网站建设技术,精于网页设计,有多年建站和网站代运营经验,设计师为客户打造网络企业风格,提供周到的建站售前咨询和贴心的售后服务。对于网站建设、成都网站制作中不同领域进行深入了解和探索,创新互联在网站建设中充分了解客户行业的需求,以灵动的思维在网页中充分展现,通过对客户行业精准市场调研,为客户提供的解决方案。
我们都知道,如果想给某个类新增功能,但又要避免在原类上修改代码,最常用的方式就是新增一个类来继承目标类,但是如果增加多的话,会使类的数量爆炸式增长,为管理带来巨大的麻烦,装饰器模式就比较好地解决了这一点。
从设计的角度看,装饰器模式涉及到四个角色:
今天我们一起来看看深度了解一下装饰器的玩法!
下面以生产一件衣服为例,一块布料裁剪好了之后做出的衣服样子还可以,但是这样的衣服是卖不出去的,因为毫无美感,因此我们需要通过一些装饰来使衣服变得好看。
我们先来创建一个抽象类或者接口,定义一个骨架,如下:
- /**
- * 建立基本骨架
- */
- public interface Clothes {
- void makeClothes();
- }
接着创建一个我们需要装饰的源类,如下:
- /**
- * 被装饰类
- */
- public class MakeClothes implements Clothes {
- @Override
- public void makeClothes() {
- System.out.println("制作一件衣服");
- }
- }
再来创建我们的主角,装饰类,如下:
- /**
- * 装饰类
- */
- public class Decorator implements Clothes {
- private Clothes clothes;
- public Decorator(Clothes clothes) {
- this.clothes = clothes;
- }
- @Override
- public void makeClothes() {
- clothes.makeClothes();
- }
- }
最后,分别创建两个具体的装饰类,如下:
- /**
- * 具体的装饰类
- */
- public class EmbroideryDecorator extends Decorator {
- public EmbroideryDecorator(Clothes clothes) {
- super(clothes);
- }
- @Override
- public void makeClothes() {
- super.makeClothes();
- System.out.println("给衣服绣制花朵");
- }
- }
- /**
- * 具体的装饰类
- */
- public class MickeyDecorator extends Decorator {
- public MickeyDecorator(Clothes clothes) {
- super(clothes);
- }
- @Override
- public void makeClothes() {
- super.makeClothes();
- System.out.println("给衣服绘制米老鼠图案");
- }
- }
怎么用呢?请看下面的测试类:
- /**
- * 客户端
- */
- public class DecorateClient {
- public static void main(String[] args) {
- Clothes clothes = new MakeClothes();
- clothes = new EmbroideryDecorator(clothes);//给衣服绣花
- clothes = new MickeyDecorator(clothes);//给衣服添加米老鼠图案
- clothes.makeClothes();
- System.out.println("成品已经完成!");
- }
- }
输出结果如下:
- 制作一件衣服
- 给衣服绣制花朵
- 给衣服绘制米老鼠图案
- 成品已经完成
制作一件衣服给衣服绣制花朵给衣服绘制米老鼠图案成品已经完成
从结果上,可以看到,我们成功的给MakeClothes这个类,动态添加了2个方法,一个是给衣服绣花,另一个是给衣服添加米老鼠图案,最后成品完成!
可见装饰的效果还不错~
其实在 jdk 中,装饰者设计模式也有很多典型的场景应用,例如我们熟悉的io包中的字节输入、输出流,就用到了装饰者设计模式!
其中FilterInputStream、FilterOutputStream就是装饰类,用于动态给输入、输出流增加方法!
巧妙采用装饰器模式,可以很好的解决类继承数量过多的问题,让代码清晰可读。
但是如果装饰层数过多,也会影响到代码的维护,因此在实际的使用过程中,还需灵活使用!
网页名称:巧妙的运用装饰器,让你的代码高出一个逼格!
转载注明:http://www.csdahua.cn/qtweb/news13/308913.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网