装饰者模式

装饰者模式应用场合:当需要为一个特定实物加上各式各样职责的时候,可能未来还有更多的职责要附加在该实物身上,为了符合设计模式中的一个原则---开放关闭原则,在不去修改类、只要增加一些类的情况下,便可达到这种目的。

比如:1.为一个人进行装饰,衣服、裤子、鞋子、帽子等、一个人每天都有不同的装饰,这是无法去预测的。

            2.为饮料中加入不同的调料,每个人的口味不同,这也是无法预测的。

为了解决这类问题,使用在运行时进行组合方式能够很好的解决这类问题。---装饰者模式~~

装饰者模式的基本结构图:

 

以一个场景模拟装饰者模式:一个人早上起来要想今天出门应该怎么打扮才好。~~~

组件接口:

?
1
2
3
4
5
6
7
8
9
10
11
12
/**
  * 组件接口,接口中有些方法
 
  * @author ChenST
  *
  * @create 2010-3-9
  */
public interface Component {
      
     /**  打扮 */
     public void dress();
}

组件接口的实现类:一个人

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
  * 人的一个类,人需要打扮
 
  * @author Administrator
  *
  * @create 2010-3-9
  */
public class Human implements Component {
  
     /*
      * 开始打扮
      * (non-Javadoc)
      * @see com.shine.model.component.Component#dress()
      */
     public void dress() {
         System.out.print( "我今天要穿:" );
     }
}

装饰者抽象类:实现了Component接口,目的是为了和被装饰者类型保持一致性

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
  * 装饰者接口,通用装饰器
 
  * @author ChenST
  *
  * @create 2010-3-9
  */
public abstract class Decorator implements Component {
  
     /*
      * 打扮
      * (non-Javadoc)
      * @see com.shine.model.component.Component#dress()
      */
     public abstract void dress();
}

具体装饰者1:--衣服。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
  * 装饰物-衣服
  * @author Administrator
  *
  * @create 2010-3-9
  */
public class Clothes extends Decorator {
  
     /** 被装饰物(装饰目标)*/
     private Component component;
      
     public Clothes(Component component){
         this .component = component;
     }
      
     @Override
     public void dress() {
         this .component.dress();
         //在原始打扮上加上该装饰-衣服
         System.out.print( "衣服" );
     }
}

具体装饰者2:--裤子

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
  * 装饰对象--裤子
 
  * @author ChenST
  *
  * @create 2010-3-9
  */
public class Trousers extends Decorator {
  
     /** 被装饰物(装饰目标)*/
     private Component component;
      
     public Trousers(Component component){
         this .component = component;
     }
      
     @Override
     public void dress() {
         this .component.dress();
         //在原始打扮上加上该装饰-裤子
         System.out.print( " 裤子 " );
     }
}

具体装饰者3:--鞋子

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
  * 装饰对象--鞋子
 
  * @author ChenST
  *
  * @create 2010-3-9
  */
public class Shoes extends Decorator {
  
     /** 被装饰物(装饰目标)*/
     private Component component;
      
     public Shoes(Component component){
         this .component = component;
     }
      
     @Override
     public void dress() {
         this .component.dress();
         //在原始打扮上加上该装饰-鞋子
         System.out.print( " 鞋子 " );
     }
}

测试类:这个人开始打扮啦~~~~~

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
  * 测试装饰者模式(模拟场景:一个人出门要装扮)
 
  * @author ChenST
  *
  * @create 2010-3-9
  */
public class Test {
  
     public static void main(String[] args) {
         //描述一个人
         Component human= new Human();
         //这个人要穿衣服,用衣服去装饰,得到穿衣服后的人
         human= new Clothes(human);
         human.dress();
         System.out.println();
         //这个人要穿裤子,用裤子去装饰,得到穿衣服和裤子后的人
         human= new Trousers(human);
         human.dress();
         System.out.println();
         //这个人要穿鞋子,用鞋子去装饰,得到穿衣服、裤子和鞋子后的人
         human= new Shoes(human);
         human.dress();
     }
}

原文网址:http://cst.is-programmer.com/posts/15854.html

你可能感兴趣的:(装饰者模式)