美文网首页
结构模式

结构模式

作者: 小张同学_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