简单介绍装饰者模式

装饰者模式(Decorator Pattern,有的也用 Wrapper Pattern就是动态地把职责附加到已有对象上去,实现功能扩展。这种特性,使得 装饰者模式提供了比继承更具有弹性的解决方案
 
实例场景 : 给中国美国(或者其它国家)的女孩加上外表的属性(如长发,身高等),
 
UML图:
    
 
 
 
步骤:
    1 创建一个女孩girl
 1 /**
 2 * @Author : zhuhuicong
 3 * 2018/12/2 22:57
 4 * @Version 1.0
 5 * 抽象Girl
 6 */
 7 public abstract class Girl {
 8 String description = "no particular";
 9 
10 public String getDescription() {
11 return description;
12 }
13 }
View Code

  2 创建一个具有特性的女孩(这里以美国女孩为例),继承顶级类girl

 1 /**
 2 * @Author : zhuhuicong
 3 * 2018/12/2 23:00
 4 * @Version 1.0
 5 * 美国女孩
 6 */
 7 public class AmericanGirl extends Girl {
 8 public AmericanGirl() {
 9 description = "+AmericanGirl";
10 }
11 }
View Code

  3 创建一个装饰者的抽象类,根据UML图可知,继承girl类

1 /**
2 * @Author : zhuhuicong
3 * 2018/12/2 23:03
4 * @Version 1.0
5 * 装饰者
6 */
7 public abstract class GirlDecorator extends Girl {
8 public abstract String getDescription();
9 }
View Code

  4根据自己的需求进行装饰(这里仅仅以金发,身高为例)

 1 /**
 2 * @Author : zhuhuicong
 3 * 2018/12/2 23:05
 4 * @Version 1.0
 5 * 装饰头发
 6 */
 7 public class GoldHandler extends GirlDecorator {
 8 private Girl girl;
 9 
10 public GoldHandler(Girl g) {
11 girl = g;
12 }
13 
14 @Override
15 public String getDescription() {
16 return girl.getDescription() + " with golden hair";
17 }
18 }
View Code
 1 public class Tall extends GirlDecorator {
 2 private Girl girl;
 3 
 4 public Tall(Girl g) {
 5 girl = g;
 6 }
 7 
 8 @Override
 9 public String getDescription() {
10 return girl.getDescription()+" is very tall";
11 }
12 }
View Code

  5创建一个测试类,给美国女孩加上装饰

 1 /**
 2 * @Author : zhuhuicong
 3 * 2018/12/2 23:09
 4 * @Version 1.0
 5 */
 6 public class DecorateTest {
 7 public static void main(String[] args) {
 8 AmericanGirl g = new AmericanGirl();
 9 System.out.println(g.getDescription());
10 GoldHandler g2 = new GoldHandler(g);
11 System.out.println(g2.getDescription());
12 Tall g3 = new Tall(g2);
13 System.out.println(g3.getDescription());
14 }
15 }
16 
17 Result:
18 AmericanGirl
19 AmericanGirl with golden hair
20 AmericanGirl with golden hair is very tall
View Code
总结 :
    当你需要动态的给一个对象添加功能,实现功能扩展的时候,就可以使用装饰者模式
常见的应用场景 :
    在JavaIO类中,BufferedReader装饰了InputStreamReader
        BufferReader input = new BufferReader(new InputStreamReader(System.in))
 
说明 :以上的实例来自实验楼学习网站.
 
 
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/songyoulian/p/10068458.html
今日推荐