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


    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();
        }
    }

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

    二、代理模式使用场景


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

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

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

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

  • 相关阅读:
    C#开发Activex控件疑难杂症
    spring、struts、mybatis、Postgresql集成使用存储过程进行分页
    C#开发Activex控件升级
    通过Maven将Web程序部署到远程Tomcat8服务器的一些注意事项
    分页存储过程Oracle版
    JSP EL表达式(转)
    关于Log4x
    C#类在初始化时的执行顺序
    使用MSMQ 远程队列
    tomcat部署与Context(转)
  • 原文地址:https://www.cnblogs.com/KKSJS/p/9622823.html
Copyright © 2020-2023  润新知