装饰者模式--Java篇

  装饰者模式(Decorator)动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式比生成子类更为灵活。

  1.定义接口,可以动态的给对象添加职责。

1 package com.lujie;
2 
3 public interface SuperPerson {
4     //定义一个接口,可以动态的给对象添加职责
5     public abstract void show() ;
6 }

  2.实现这个接口

 1 package com.lujie;
 2 
 3 public class Person implements SuperPerson{
 4     private String name;
 5     public Person() {
 6         // TODO Auto-generated constructor stub
 7     }
 8     public  Person(String name) {
 9         this.name=name;
10     }
11     //具体对象的操作
12     public void show() {
13         System.out.println("装饰者:"+name);
14     }
15 }

  3.装饰类

 1 package com.lujie;
 2 
 3 public class Finery extends Person{
 4     protected Person component;
 5     //设置component
 6     public void Decorate(Person component) {
 7         this.component=component;
 8     }
 9     //重写show(),实际执行的是component的show()操作
10     public void show() {
11         if(component!=null){
12             component.show();
13         }
14     }
15 
16 }

  4.具体实现的装饰类

1 package com.lujie;
2 
3 public class Shoes extends Finery{
4     //首先执行本类的功能,再运行原Component的show(),相当于对原Component进行了装饰
5     public void show() {
6         System.out.println("皮鞋");
7         super.show();
8     }
9 }
1 package com.lujie;
2 
3 public class Suit extends Finery{
4     //首先执行本类的功能,再运行原Component的show(),相当于对原Component进行了装饰
5     public void show() {
6         System.out.println("西装");
7         super.show();
8     }
9 }
package com.lujie;
//具体服饰类
public class TShirts extends Finery{
    //首先执行本类的功能,再运行原Component的show(),相当于对原Component进行了装饰
    public void show() {
        System.out.println("大体恤");
        super.show();
    }
}
1 package com.lujie;
2 
3 public class WearSneakers extends Finery{
4     public void show() {
5         System.out.println("破球鞋");
6         super.show();
7     }
8 }

  5.测试用例:

 1 package com.lujie;
 2 
 3 public class PersonShowMain {
 4 
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7         Person person=new Person("小明");
 8         System.out.println("第一种装扮:");
 9         WearSneakers wSneakers=new WearSneakers();
10         BigTrouser bigTrouser=new BigTrouser();
11         TShirts tShirts=new TShirts();
12         //装饰过程
13         wSneakers.Decorate(person);
14         bigTrouser.Decorate(wSneakers);
15         tShirts.Decorate(bigTrouser);
16         tShirts.show();
17         //装饰过程二
18         System.out.println("第二种装扮:");
19         Suit suit=new Suit();
20         wSneakers.Decorate(person);
21         bigTrouser.Decorate(wSneakers);
22         suit.Decorate(bigTrouser);
23         suit.show();
24     }
25 
26 }

  6.运行结果:

原文地址:https://www.cnblogs.com/luerniu/p/5442812.html