设计模式--装饰模式--代理模式--外观模式

一.装饰模式:动态地给一个对象增加一些额外的职责,就增加的功能来说,装饰模式相比生成子类更加灵活。

1)有一个接口

1 public interface Source {
2     public void method();
3 }

 2)有一个类实现了这个接口

1 public class OldClass implements Source{
2 
3     @Override
4     public void method() {
5         System.out.println("old class method");        
6     }
7     
8 }

3)现在想给这个类动态的添加一个功能.

 1 public class NewClass implements Source{
 2     private Source oldClass;
 3     
 4     public NewClass(Source oldClass) {
 5         super();
 6         this.oldClass = oldClass;
 7     }    
 8     
 9     @Override
10     public void method() {
11         System.out.println("before old class ");
12         oldClass.method();
13         System.out.println("after old class");
14     }
15 
16 }

 4)使用

 1 public class Main {
 2 
 3     public static void main(String[] args) {
 4         // TODO Auto-generated method stub
 5         Source oldClass = new OldClass();
 6         Source newClass = new NewClass(oldClass);
 7         newClass.method();
 8     }
 9 
10 }

 最后,如果用类的继承的话,过多的继承会导致子类很多,结构混乱.

 

二,代理模式:为使用者提供一种代理,对这个对象访问,但使用者意识不到这个对象的存在.

1)现有一个接口

1 public interface SourceInterface {
2     public void method();
3 }

2)实现一个Source类

1 public class Source implements SourceInterface{
2 
3     @Override
4     public void method() {
5         System.out.println("Source Method");
6     }
7 
8 }

3)实现一个Proxy类

 1 public class Proxy implements SourceInterface{
 2     private SourceInterface source;
 3 
 4     public Proxy() {
 5         super();
 6         this.source = new Source();
 7     }
 8 
 9     @Override
10     public void method() {
11         System.out.println("before");
12         source.method();
13         System.out.println("after");
14     }
15 
16 }

4)使用

1 public class Main {
2 
3     public static void main(String[] args) {
4         Proxy p = new Proxy();
5         p.method();
6     }
7 
8 }

对于使用者来说,,只需关心代理类即可.

三.外观模式

当类太多,需要一个统一的类来管理这些类,而使用者只需调用这个统一的类即可

比如现在有

  主机类

  键盘类

  鼠标类

  显示器类

如果使用者想使用电脑就要依次调用这4个类才行.

现在定义一个外观类--电脑类来管理这4个类

使用者只需要调用电脑类即可.

posted @ 2013-03-09 13:01  firerdong  阅读(115)  评论(0编辑  收藏  举报