文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

巧妙的运用装饰器,让你的代码高出一个逼格!

2024-12-02 21:02

关注

我们都知道,如果想给某个类新增功能,但又要避免在原类上修改代码,最常用的方式就是新增一个类来继承目标类,但是如果增加多的话,会使类的数量爆炸式增长,为管理带来巨大的麻烦,装饰器模式就比较好地解决了这一点。

[[426041]]

从设计的角度看,装饰器模式涉及到四个角色:

今天我们一起来看看深度了解一下装饰器的玩法!

二、代码示例

下面以生产一件衣服为例,一块布料裁剪好了之后做出的衣服样子还可以,但是这样的衣服是卖不出去的,因为毫无美感,因此我们需要通过一些装饰来使衣服变得好看。

我们先来创建一个抽象类或者接口,定义一个骨架,如下:

  1.  
  2. public interface Clothes { 
  3.  
  4.     void makeClothes(); 

接着创建一个我们需要装饰的源类,如下:

  1.  
  2. public class MakeClothes implements Clothes { 
  3.  
  4.     @Override 
  5.     public void makeClothes() { 
  6.         System.out.println("制作一件衣服"); 
  7.     } 

再来创建我们的主角,装饰类,如下:

  1.  
  2. public class Decorator implements Clothes { 
  3.  
  4.     private Clothes clothes; 
  5.  
  6.     public Decorator(Clothes clothes) { 
  7.         this.clothes = clothes; 
  8.     } 
  9.  
  10.     @Override 
  11.     public void makeClothes() { 
  12.         clothes.makeClothes(); 
  13.     } 
  14.  

最后,分别创建两个具体的装饰类,如下:

  1.  
  2. public class EmbroideryDecorator extends Decorator { 
  3.  
  4.  
  5.     public EmbroideryDecorator(Clothes clothes) { 
  6.         super(clothes); 
  7.     } 
  8.  
  9.     @Override 
  10.     public void makeClothes() { 
  11.         super.makeClothes(); 
  12.         System.out.println("给衣服绣制花朵"); 
  13.     } 

 

  1.  
  2. public class MickeyDecorator extends Decorator { 
  3.  
  4.  
  5.     public MickeyDecorator(Clothes clothes) { 
  6.         super(clothes); 
  7.     } 
  8.  
  9.     @Override 
  10.     public void makeClothes() { 
  11.         super.makeClothes(); 
  12.         System.out.println("给衣服绘制米老鼠图案"); 
  13.     } 

怎么用呢?请看下面的测试类:

  1.  
  2. public class DecorateClient { 
  3.  
  4.     public static void main(String[] args) { 
  5.         Clothes clothes = new MakeClothes(); 
  6.         clothes = new EmbroideryDecorator(clothes);//给衣服绣花 
  7.         clothes = new MickeyDecorator(clothes);//给衣服添加米老鼠图案 
  8.         clothes.makeClothes(); 
  9.         System.out.println("成品已经完成!"); 
  10.     } 

输出结果如下:

  1. 制作一件衣服 
  2. 给衣服绣制花朵 
  3. 给衣服绘制米老鼠图案 
  4. 成品已经完成 

制作一件衣服给衣服绣制花朵给衣服绘制米老鼠图案成品已经完成

从结果上,可以看到,我们成功的给MakeClothes这个类,动态添加了2个方法,一个是给衣服绣花,另一个是给衣服添加米老鼠图案,最后成品完成!

可见装饰的效果还不错~

三、应用

其实在 jdk 中,装饰者设计模式也有很多典型的场景应用,例如我们熟悉的io包中的字节输入、输出流,就用到了装饰者设计模式!

其中FilterInputStream、FilterOutputStream就是装饰类,用于动态给输入、输出流增加方法!

四、总结

巧妙采用装饰器模式,可以很好的解决类继承数量过多的问题,让代码清晰可读。

但是如果装饰层数过多,也会影响到代码的维护,因此在实际的使用过程中,还需灵活使用!

 

来源:Java极客技术内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯