美文网首页
结构模式

结构模式

作者: 小张同学_loveZY | 来源:发表于2018-08-17 15:28 被阅读0次

7. 代理模式

代理模式的本质:控制对象访问。

静态代理
  • 外部公共接口

      public interface Subject {
            /**
             * 示意方法:一个抽象的请求方法
             */
            public void request();
      }
    
  • 具体实现类

      public class RealSubject implements Subject{
            public void request() {
               //执行具体的功能处理
            }
      }
    
  • 具体代理类

      public class Proxy implements Subject{
            private RealSubject realSubject=null;
      
            public Proxy(RealSubject realSubject){
               this.realSubject = realSubject;
            }
            public void request() {
               //在转调具体的目标对象前,可以执行一些功能处理      
               //转调具体的目标对象的方法
               realSubject.request(); 
               //在转调具体的目标对象后,可以执行一些功能处理
            }
      }
    
  • 由于代理的存在,可以在访问具体实现之前进行权限验证、附加功能等等。
动态代理(java)
  • java.lang.reflect 包
    • Proxy 类
    • InvocationHandler 接口
  • 动态代理类始终只有一个invoke方法
  • 由于java动态代理是通过接口实现的,故先定义接口

      public interface ICook {
      
           void dealWithFood();
      
           void cook();
      }
    
  • 具体的实现类

      public class CookManager implements ICook {
      
          @Override
          public void dealWithFood() {
              System.out.println("food had been dealed with");
          }
      
          @Override
          public void cook() {
              System.out.println("cook food");
          }
      }
    
  • 代理类,需要实现InvocationHandler接口,其中的invoke调用具体的功能代码。

      public class DynamicProxyHandler implements InvocationHandler{
          Object realCookManager;
          // 注入真正的实现类
          DynamicProxyHandler(ICook realCookManager){
              this.realCookManager = realCookManager;
          }
          // 调用具体方法
          @Override
          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
              System.out.println("invoke start");
              method.invoke(realCookManager,args);
              System.out.println("invoke end");
              return null;
          }
      }
    
  • 客户端

      public class Main {
          public static void main(String[] args){
      
              CookManager cookManager = new CookManager();
              // 代理类
              DynamicProxyHandler dynamicProxyHandler = new DynamicProxyHandler(cookManager);
              
              // 通过Proxy的newProxyInstance中的反射机制,生成最后的代理类
              ICook iCook =(ICook)Proxy.newProxyInstance(dynamicProxyHandler.getClass().getClassLoader(),cookManager.getClass().getInterfaces(), dynamicProxyHandler);
              
              //代理类调用具体的方法,输入正确的参数。
              iCook.dealWithFoot();
              iCook.cook();
          }
      }
    
  • 角色:代理类,实际类。代理类和实际类实现同一个接口,客户端通过代理类调用实现类的具体方法。

8. 装饰者

  • 装饰模式的本质:功能细化,动态组合。 奖金计算例子
  • 可以参考代理模式,装饰模式在代理模式上多了一层抽象,然后下分出多个实现。
  • 装饰者模式主要是用来增加类的职责和行为的,将类的核心职责和装饰功能区分开,可以很方便对装饰功能进行添加和去除。
  • 代理模式主要是完成被代理的功能,同时可以做一些验证工作。
  • 角色:
    • 抽样功能类
    • 具体功能类
    • 抽象装饰者
    • 具体装饰者:多个不同的复杂实现,包装功能类

9. 外观模式

  • 一个是界面,一个是接口:为一组子系统定义一个统一的接口。
  • 减少外界与子系统内多个模块的交互,松散耦合。
  • 外观模式的本质:封装交互,简化调用。
  • 角色:
    • facade 类,对客户端提供统一的访问接口方法
    • 具体系统子类,系统内部具体完成功能的子类
    • 抽象系统子类

10. 适配器模式

  • 适配器模式的本质:转换匹配,复用功能。
  • 适配器通常是一个类,一般会让适配器类去实现Target接口,在适配器的具体实现里面调用Adaptee。
  • 体现更好的复用性,更好的扩展性
  • 角色:
    • 适配器类,实现目标接口,并适配适配类,调用其中功能
    • 被适配类
    • 目标接口

11. 桥接模式

  • 桥接模式的本质:分离两个维度的功能。
  • 将系统按两个维度区分考虑,并且桥接使用(桥接后还可作为一个维度与另一个功能桥接)。从而避免多对多情况下复杂逻辑组合。
  • 角色:
    • X维度虚功能类,其中组合一个Y维度的功能接口
    • X维度具体功能类(可扩展)
    • Y维度功能接口
    • Y维度实现类

12. 组合模式结构

  • 组合模式的本质:统一叶子对象和组合对象的操作,易形成树结构的模型。
  • 组合模式自带部分与整体的关系。
  • 角色:
    • 抽象组件
    • 继承抽象组件的叶子结点(不包含抽象组件成员)
    • 继承抽象组件的组件节点(含抽象组件),也即组合来意。

13. 享元模式

  • 享元模式的本质:分离与共享。
  • 减少对象数量,节省内存空间,如共用的缓存数据,数据库连接池等
  • 应用场景:应用中包含大量的重复的细粒度数据,将其抽取出来共享管理。
  • 角色:
    • 享元工厂:内含一个hashMap的缓存保存细粒度数据。
    • 享元接口:抽象出功能
    • 共享类:
    • 非共享类

相关文章

网友评论

      本文标题:结构模式

      本文链接:https://www.haomeiwen.com/subject/xixtiftx.html