JAVA测试装饰者模式

 1 package shb.java.demo;
 2 /**
 3  * 测试装饰者模式
 4  * @package :shb.java.demoJava02
 5  * @author shaobn
 6  * @Describe :
 7  * @Time: 2015-9-9 上午12:17:00
 8  */
 9 public class TestDecrator {
10 
11     /**
12      * @author shaobn
13      * @Describe :
14      * @param args
15      * @Time : 2015-9-9 上午12:16:49
16      */
17     public static void main(String[] args) {
18         // TODO Auto-generated method stub
19         CampusActivity ca = new AdvancedAct(new CampusInnerAct());
20         ca.play();
21         CampusActivity ca_2 = new AdvancedAct(new CampusOuterAct());
22         ca_2.play();
23     }
24 
25 }
26 interface CampusActivity{
27     
28     void play();
29 }
30 class CampusInnerAct implements CampusActivity{
31     public void play(){
32         System.out.println("和小伙伴去打篮球");
33     }
34 }
35 class CampusOuterAct implements CampusActivity{
36     public void play(){
37         System.out.println("和小伙伴去市中心逛街");
38     }
39 }
40 class Campus__ implements CampusActivity{
41     public void play(){
42         
43     }
44 }
45 class AdvancedAct implements CampusActivity{
46     private CampusActivity ca;
47     public AdvancedAct(CampusActivity ca){
48         this.ca = ca;
49     }
50     public void play(){
51         ca.play();
52         System.out.println("骑着电动车去打排球,开着汽车去参加唱歌");
53     }
54     
55 }
 1 package shb.java.demo;
 2 /**
 3  * 测试装饰者模式
 4  * @package :shb.java.demoJava02
 5  * @author shaobn
 6  * @Describe :
 7  * @Time: 2015-9-9 上午12:17:00
 8  */
 9 public class TestDecrator_2 {
10 
11     /**
12      * @author shaobn
13      * @Describe :
14      * @param args
15      * @Time : 2015-9-9 上午12:16:49
16      */
17     public static void main(String[] args) {
18         // TODO Auto-generated method stub
19         AdCampusInnerAct acia = new AdCampusInnerAct();
20         acia.play();
21         AdCampusOuterAct acoa = new AdCampusOuterAct();
22         acoa.play();
23     }
24 
25 }
26 interface CampusActivity{
27     
28     void play();
29 }
30 class CampusInnerAct implements CampusActivity{
31     public void play(){
32         System.out.println("和小伙伴去打篮球");
33     }
34 }
35 class AdCampusInnerAct extends CampusInnerAct{
36     public void play(){
37         super.play();
38         System.out.println("骑着电动车和小伙伴去打排球");
39     }    
40 }
41 class CampusOuterAct implements CampusActivity{
42     public void play(){
43         System.out.println("和小伙伴去市中心逛街");
44     }
45 }
46 class AdCampusOuterAct extends CampusOuterAct{
47     public void play(){
48         super.play();
49         System.out.println("开着汽车出去唱歌");
50     }
51 }
52 class Campus__{
53     public void play(){
54         
55     }
56 }
57 class AdCampus__ extends Campus__{
58     public void play(){
59         //增强功能......
60     }
61 }

第一段为使用装饰者模式,第二段为使用继承。

其实我们从两段代码可以看出,我们的目的是想让原有的功能增强,所以才衍生出更加丰富的方法,因此我们自然会想到继承。同时有一个问题也随之出现,当我们使用继承的时候,发现需要增加的类变得很多时,我们都需要重新写一个类去继承父类,从而重写方法。这样会增加很大的负担,而且耦合性很高,不易于程序的扩展。随之而来,装饰者模式到来。我们只需定义一个接口的子类,然后拿到同一个接口的引用,继而去增强属于该接口引用下的子类对象的方法即可。

两段代码比对,比较明显看出优劣。

如有错误,希望大家纠正。

不早了,睡觉了。。。。

2015-09-09

吾宁做一叶扁舟,始航于湖边,遨游于海上,浪迹于江中。
原文地址:https://www.cnblogs.com/assassin666/p/4793457.html