目录
由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介
优点:
1.在客户端与目标对象之间起到一个中介作用和保护目标对象的作用
2.可以扩展目标对象的功能
3.将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性
缺点:
1.会造成系统设计中类的数量增加
2.在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢
3.增加了系统的复杂度
抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能

- package proxy;
- public class ProxyTest {
- public static void main(String[] args) {
- Proxy proxy = new Proxy();
- proxy.Request();
- }
- }
- //抽象主题
- interface Subject {
- void Request();
- }
- //真实主题
- class RealSubject implements Subject {
- public void Request() {
- System.out.println("访问真实主题方法...");
- }
- }
- //代理
- class Proxy implements Subject {
- private RealSubject realSubject;
- public void Request() {
- if (realSubject == null) {
- realSubject = new RealSubject();
- }
- preRequest();
- realSubject.Request();
- postRequest();
- }
- public void preRequest() {
- System.out.println("访问真实主题之前的预处理。");
- }
- public void postRequest() {
- System.out.println("访问真实主题之后的后续处理。");
- }
- }
-
-
1.AOP:通过定义切面、切入点和通知等,Spring AOP在运行时生成代理对象,将切面逻辑织入到目标对象的方法调用中。代理对象在方法调用前后执行附加操作,如日志记录、性能监控等。
2.动态代理(JDK动态代理、CGLIB代理):当Bean类实现了接口时,Spring使用JDK动态代理来为Bean生成代理对象;当Bean类没有实现接口时,Spring使用CGLIB代理来生成代理对象。
提供了统一的接口,用来访问子系统中的一群接口。外观模式定义了一个高层接口,让子系统更加容易使用。

外观角色:提供一个外观接口,对外提供一个易于客户端访问的接口,对内可以访问子系统中的所有功能。
子系统角色:子系统在整个系统中可以是一个或者多个模块,每个模块都是若干类组成,这些类之间可能相互复杂的关系。
客户端:外观接口调用测试者。
优点:
1.减少系统相互依赖
2.提高灵活性
3.提高了安全性
缺点:
在不对外观类进行抽象的时候,如果需要添加新的子系统,就需要对外观类进行修改,违背了开闭原则
- public class CPU {
-
- public void startup(){
- System.out.println("cpu startup!");
- }
-
- public void shutdown(){
- System.out.println("cpu shutdown!");
- }
- }
-
- public class Memory {
-
- public void startup(){
- System.out.println("memory startup!");
- }
-
- public void shutdown(){
- System.out.println("memory shutdown!");
- }
- }
-
- public class Disk {
-
- public void startup(){
- System.out.println("disk startup!");
- }
-
- public void shutdown(){
- System.out.println("disk shutdown!");
- }
- }
-
- public class Computer {
- private CPU cpu;
- private Memory memory;
- private Disk disk;
-
- public Computer(){
- cpu = new CPU();
- memory = new Memory();
- disk = new Disk();
- }
-
- public void startup(){
- System.out.println("start the computer!");
- cpu.startup();
- memory.startup();
- disk.startup();
- System.out.println("start computer finished!");
- }
-
- public void shutdown(){
- System.out.println("begin to close the computer!");
- cpu.shutdown();
- memory.shutdown();
- disk.shutdown();
- System.out.println("computer closed!");
- }
- }
-
- //测试
- public class User {
-
- public static void main(String[] args) {
- Computer computer = new Computer();
- computer.startup();
- computer.shutdown();
- }
- }
如果没有Computer类,那么,CPU、Memory、Disk他们之间将会相互持有实例,产生关系,这样会造成严重的依赖,修改一个类,可能会带来其他类的修改,这不是我们想要看到的,有了Computer类,他们之间的关系被放在了Computer类里,这样就起到了解耦的作用,这,就是外观模式!
1.对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系
2.当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问
3.当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性