zoukankan      html  css  js  c++  java
  • 外观模式、代理模式、简单工厂模式

    外观模式

    其定义为:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一个子系统更加容易用。

    (依然是说的十分抽象。。。)

    具体表现为:定义一个Facade外观类,在这个外观类中调用各个子系统的方法或属性。这里的子系统可以理解为与外观类 构成了 聚合 关系。

    public class Fund {
        Stock1 gu1;
        Stock2 gu2;
        Stock3 gu3;
        public Fund(){
            gu1 = new Stock1();
            gu2 = new Stock2();
            gu3 = new Stock3();
        }
        public void buyFund(){
            gu1.buy();
            gu2.buy();
            gu3.buy();
        }
    
        public void sellFund(){
            gu1.sell();
            gu2.sell();
            gu3.sell();
        }
    }
    abstract class Stock{
        public abstract void buy();
    
        public abstract void sell();
    }
    class Stock1 extends Stock{
    
        @Override
        public void buy() {
    
        }
    
        @Override
        public void sell() {
    
        }
    }
    class Stock2 extends Stock{
    
        @Override
        public void buy() {
    
        }
    
        @Override
        public void sell() {
    
        }
    }
    class Stock3 extends Stock{
    
        @Override
        public void buy() {
    
        }
    
        @Override
        public void sell() {
    
        }
    }

    上面这段代码里Fund类就是外观类。在其构造函数中初始化各个子系统,并且在它的其他成员方法中调用每个子系统的方法。

    看起来是不是有点熟悉。

    回忆一下简单工厂模式,其目的是为了操作工厂类得到实际想要的FatherClass的子类对象,具体方法实现是传入一个参数,根据参数用switch或者if进行判断,然后再决定new的是哪个子类对象返回。

    两种模式下都是在一个 额外的类中去创建 子系统的对象。不同之处在于简单工厂模式的output是一个子系统对象。而外观模式没有对外返回子系统对象。

    外观模式,其目的是为了执行子系统对象中的各个方法,并且把这些子系统和子系统的方法对调用者隐藏掉,由外观类统一处理。new的是所有需要用到的子系统的对象,new的目的是为了执行子系统对象的成员方法。

    这种模式其实看起来跟 代理模式有些相像。

    看一下代理模式的定义:为其他对象提供一种代理,以控制对这个对象的访问。以java中经典的jdk动态代理为例

    public class MyInvovaHandler implements InvocationHandler {
     
     
        private Object target;
     
        public MyInvovaHandler(Object target){
            this.target = target;
        }
     
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object obj = method.invoke(target, args);//通过反射调取业务的目标方法
            return obj;
        }
    }

    其目的主要是通过代理类去操作 目标类中的方法,控制被代理类的方法访问。比如A想跟B表白,想让C代理,那么C就通过(反射)去调用A心里的表白方法()。具体怎么表白是由A的内部逻辑决定的,这个调用方法的过程是由C通过反射发起的。

    而外观模式侧重于对外部调用者提供简化的方法。只需要A告诉C:我要跟B表白了,你去操作一下。

    然后B就马上查子系统资料,该怎么表白,直接自己定义一个void 表白();方法,在里面调用各个子系统 像花店.买花(), 电影院.买电影票(),信.写表白信().....

    这里调用的都是子系统的成员方法。

     外观模式的适用场景:很多传统的“屎山”项目,在它基础上做扩展或修改,动又不敢动,改也不敢改。可以使用外观模式定义外观类Facade,专门跟这种系统做“交互”,扩展的时候直接去调用Facade中定义的接口。

  • 相关阅读:
    定理环境
    tcolorbox 宏包简明教程
    【专访】南科大数学系何炳生教授——四十年上下求索
    研究生导师为什么喜欢问学生家境?
    高德纳谈《具体数学》的诞生
    剑桥大学
    线性代数
    APPCAN的mas服务报错
    github删除仓库
    Angular2入门教程-2 实现TodoList App
  • 原文地址:https://www.cnblogs.com/whutwxj/p/15214501.html
Copyright © 2011-2022 走看看