`

Decorator模式

阅读更多

最近遇到一个需求,是要对一个类增加一些新的功能,原则上讲是不改变这个类的代码,不改变这个类的继承关系。以前了解过Decorator模式,所以特意又深入学习一会。

什么时候需要Decorator模式:它的主要功能是不改变类的代码和继承关系,为这个类增加功能。

例如我要计划做一件事情(例如 打印某段文字)

Java代码

 

  1. public class DoWork(){   
  2.     public void doWork(){   
  3.         System.out.prinln("Do Work.....");   
  4.     }   
  5. }  

 

public class DoWork(){ public void doWork(){ System.out.prinln("Do Work....."); }}]

可是由于工作变化,我需要在DoWork之前做另外一件事(打印一段特殊文字),并且在做完DoWork以后还要做一些简单的处理(同样是打印文字)。如何在不改变原有的继承关系的前提下实现此功能?

首先我们观察,所有的工作都是围绕做某件事情,所以我们可以抽象出一个接口。

Java代码

 

  1. public interface Work(){   
  2.     public void doWork();   
  3. }  

 

public interface Work(){ public void doWork();}

所以原有的类可以更改为

Java代码

 

  1. public class DoWork implements Work(){   
  2.   public void doWork(){   
  3.       System.out.println("Do Work....");   
  4.   }   
  5. }  

 

public class DoWork implements Work(){ public void doWork(){ System.out.println("Do Work...."); }}

我们可以考虑按照要求,我们所要添加的两个动作也是围绕的doWork()来做文章,只是具体的实现办法有些变换,我们可以不可以另外添加一个辅助的类 OtherWork,通过他来实现要求中的两个功能,并且调用原来计划要执行的工作。

Java代码

 

  1. public class DoAllWork implements Work(){   
  2.     private Work work;   
  3.     //为调用原来计划需要执行的任务做准备   
  4.     public DoAllWork(Work work){   
  5.         this.work = work;   
  6.     }   
  7.     public void beforeWork(){   
  8.         System.out.println("Before Work....");   
  9.     }   
  10.     public void endWork(){   
  11.         System.out.println("End Work....");   
  12.     }   
  13.     public void doWork(){   
  14.         beforeWork();   
  15.         work.doWork();   
  16.         endWork();   
  17.     }   
  18. }  

 

public class DoAllWork implements Work(){ private Work work; //为调用原来计划需要执行的任务做准备 public DoAllWork(Work work){ this.work = work; } public void beforeWork(){ System.out.println("Before Work...."); } public void endWork(){ System.out.println("End Work...."); } public void doWork(){ beforeWork(); work.doWork(); endWork(); }}

我们测试一下,这个DoAllWork是不是能完成我们的需要

Java代码

 

  1. public class Main(){   
  2.     public static void main(String[] args){   
  3.         Work work = new DoWork();   
  4.         DoAllWork daw = new DoAllWork(work);   
  5.         daw.doWork;   
  6.     }   
  7. }  

 

public class Main(){ public static void main(String[] args){ Work work = new DoWork(); DoAllWork daw = new DoAllWork(work); daw.doWork; }}

OK,运行一下,一切都以实现 :) 这种通过简单的一个实现类,帮助我们达到了要求,这种模式就是Decorator模式。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics