Java设计模式之装饰模式

0. 前言  

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

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

 

1. 装饰模式介绍

装饰模式定义:

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

 

装饰模式的使用场景:

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

 

装饰模式包括的角色:

 

1)抽象组件Component类。

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

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

4)具体装饰类ConcreteDecorator

 

2.  装饰模式实例介绍

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

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

[java]  view plain  copy
  1. /** 
  2.  * Decorator Pattern 
  3.  * Created by Calvin on 2017/5/10. 
  4.  */  
  5. public class Decorator {  
  6.     public static void main(String[] args) {  
  7.         Person calvin = new Calvin();  
  8.         PersonCloth summerCloth = new SummerCloth(calvin);  
  9.         PersonCloth winterCloth = new WinterCloth(calvin);  
  10.         summerCloth.dressed();  
  11.         winterCloth.dressed();  
  12.     }  
  13.   
  14.     public static abstract class Person{  
  15.         public abstract void dressed();  
  16.     }  
  17.   
  18.     public static class Calvin extends Person{  
  19.         @Override  
  20.         public void dressed() {  
  21.             System.out.println("穿件内裤");  
  22.         }  
  23.     }  
  24.   
  25.     public static abstract class PersonCloth extends Person{  
  26.         Person myPerson;  
  27.   
  28.         public PersonCloth(Person myPerson) {  
  29.             this.myPerson = myPerson;  
  30.         }  
  31.   
  32.         @Override  
  33.         public void dressed() {  
  34.             myPerson.dressed();  
  35.         }  
  36.     }  
  37.   
  38.     public static class SummerCloth extends PersonCloth{  
  39.   
  40.         public SummerCloth(Person myPerson) {  
  41.             super(myPerson);  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值