设计模式(一):代理模式

Java设计模式

在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领域引入到计算机科学的。
设计模式并不直接用来完成代码的编写,而是描述在各种不同情况下,要怎么解决问题的一种方案。面向对象设计模式通常以类别或对象来描述其中的关系和相互作用,但不涉及用来完成应用程序的特定类别或对象。设计模式能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免会引起麻烦的紧耦合,以增强软件设计面对并适应变化的能力。

上面是维基百科对设计模式给出的解释。

一、代理模式介绍


在这里介绍设计模式中的一种:代理模式。日常生活中处处都存在代理模式。例如,有一天程序员思思想买一本书:

public interface Book {

    public void buyBook();

}

但是我们知道,书都是从制造书的工厂而来的。

public class BookFactory implements Book{
    @Override
    public void buyBook() {
        System.out.println("思思买的书来自书厂");
    }
}

思思原本准备去书厂买书,因为书厂是货真价实生产书的地方,这样不至于上当受骗。可是有人却告诉思思,家附近有一个叫做书店的地方也有书买,而且书店里卖的书质量和书厂的书一模一样。

public class BookStore implements Book{
    @Override
    public void buyBook() { 
        Book book = new BookFactory();
        book.buyBook(); 
    }
}

于是思思壮着胆子,就去了这个叫做书店的地方买了一本书,希望她不会上当。

public class SiSi {

    public static void main(String[] args) {
        Book book = new BookStore();
        book.buyBook();
    }
}

思思回到家打开包装一看,果然书店卖的书和书厂的书是一样的:

自从知道书店这么个地方以后,思思以后就在家附近也能买到质量杠杠的书啦!

上面举的例,比较形象的描述了生活中存在的代理模式。在这个例子中,要理解以下两点:

  • 书店和书厂都宣称自己有书可卖。代码表现为二者都实现了 Book 接口并实现了 buyBook 方法。
  • 书店里卖的书实际上是来自于书厂。代码表现为 BookStore 实现的 buyBook 方法内创建了 BookFactory 对象,并用这个对象调用了 buyBook 方法。

如果使用代理模式的术语,思思被称为调用者,书店是代理对象,书厂是目标对象。代理对象和目标对象都要实现同一个抽象接口,这样的话,在调用者看来(表面看来),代理对象和目标对象的功能完全一样。可终究实现卖书功能的还是目标对象,只是这对于调用者来说是不可见的。

其实思思完全也可以和以前一样直接去书厂里买书,不用经过书店这个中间商:

public class SiSi {

    public static void main(String[] args) {
        Book book = new BookFactory();
        book.buyBook();
    }
}

这就涉及到了代理模式的使用场景问题。

二、代理模式使用场景


既然用较少的代码也能完成相同的功能,那代理模式提出的意义何在呢?

  • 从上面的例子可以看出,产生一个代理对象(书店),一定程度上实现了调用者与目标对象的解耦。但是也显式的增加了代理对象与目标对象之间的耦合。

  • 当我们想要隐藏某个类时,可以为其生成代理对象。

  • 当我们想要增强某个类的功能时,也可以使用代理模式。可以将需要增强的功能写在代理对象中调用语句的前后。

posted @ 2018-05-08 18:35  driveby  阅读(149)  评论(0编辑  收藏  举报