• 入门设计模式之代理模式


    学习更多设计模式请参考:入门设计模式之汇总篇

    代理模式;给某个对象提供一个代理对象,由代理对象持有对原对象的引用。

    代理模式就比较符合中国人含蓄的性格,假如有个姑娘想要找个对象,但是直接满大街去喊我要找对象的不是很多吧。大部分的女孩还是倾向于先去找一个媒人,让媒人来给自己介绍对象。这里的媒人其实就是女孩的代理对象了。

    先来看一下类图:

    我们可以看到女孩跟媒人都实现了一个相亲的接口,然后呢媒人持有女孩的引用来调用女孩展示自己的方法,代码是这样的:

    public interface BlindDate {
        public void show();
    }
    
    public class Girl implements BlindDate {
    
        @Override
        public void show() {
            System.out.println("女孩展示自己");
        }
    }
    
    public class MatchMaker implements BlindDate {
        BlindDate bd;
    
        MatchMaker(BlindDate bd){
            this.bd=bd;
        }
    
        @Override
        public void show() {
            System.out.println("媒人牵线搭桥");
            bd.show();
            System.out.println("媒人收取中介费");
        }
    }
    

    上方这种写法确实实现了代理模式,但是细心的你可能会发现,这不符合逻辑呀,媒人怎么能也有show方法呢,她是代理,没必要搞得跟女孩一样吧,所以呢又出现了下方的实现方式

    代码实现:

    public class DynamicMatchMaker {
        private Object girl;
    
        DynamicMatchMaker(Object girl) {
            this.girl = girl;
        }
    
        public Object getProxy() {
            return Proxy.newProxyInstance(
                    girl.getClass().getClassLoader(),
                    girl.getClass().getInterfaces(),
                    new InvocationHandler() {
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                            System.out.println("媒人牵线搭桥");
                            Object returnValue = method.invoke(girl, args);
                            System.out.println("媒人收取中介费");
                            return returnValue;
                        }
                    });
        }
    }
    

    这种实现看来其实还是可以的哈,满符合逻辑的,相当于找媒人获得了女孩的联系方式




    本文出自https://zhixiang.org.cn/#/blog/read/5191ebb4-4ca2-44d4-ab74-ee1834ba547c,转载请保留。

  • 相关阅读:
    Browserify
    PhantomJS:基于WebKit、开源的服务器端JavaScript API
    ruby安装
    ssh tunnel通道
    tomcat部署方法总结
    Tomcat 部署:工程下 META-INF 目录下的 Context.xml
    UVA 674 Coin Change (DP)
    Android入门——电话拨号器和四种点击事件
    matlab reshape函数
    看看走过的路——个人重构
  • 原文地址:https://www.cnblogs.com/zhixiang-org-cn/p/9249013.html
Copyright © 2020-2023  润新知