zoukankan      html  css  js  c++  java
  • 【结构型模式】《大话设计模式》——读后感 (4)为别人做嫁衣?——静态代理模式(1)

    什么是代理模式:

    代理模式结构图:

     直接上代码:

    GiveGift接口:

    package com.sjmx.staticProxy;
    
    public interface GiveGift {
    
        void giveDolls();
        void giveFlows();
        void giveChocolate();
        
    }

    真实实体:

    package com.sjmx.staticProxy;
    
    public class Pursuit implements GiveGift {
        
        SchoolGirl girl;
        private String name;
        
        public Pursuit(String name ,SchoolGirl girl){
            this.girl = girl;
            this.name = name;
        }
        
        @Override
        public void giveDolls() {
            System.out.println(girl.getName() + ","+ this.name +"送你一个dolls");
        }
    
        @Override
        public void giveFlows() {
            System.out.println(girl.getName() + ","+ this.name +"送你一个Flows");
        }
    
        @Override
        public void giveChocolate() {
            System.out.println(girl.getName() + ","+ this.name +"送你一个Chocolate");
        }
    
    }

    代理:

    package com.sjmx.staticProxy;
    
    public class Proxy implements GiveGift{
        
        Pursuit gg ;
        
        public Proxy(String name ,SchoolGirl girl ) {
            gg = new Pursuit(name,girl);
        }
    
        public void giveDolls() {
            gg.giveDolls();
        }
     
        public void giveFlows() {
            gg.giveFlows();
        }
    
        public void giveChocolate() {
            gg.giveChocolate();
        }
    }

    虚构的实体,真实对象想要对此实体进行某些操作:

    package com.sjmx.staticProxy;
    
    public class SchoolGirl {
        
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        
    }

    客户端代码:

    package com.sjmx.staticProxy;
    
    public class Client {
        
        public static void main(String[] args) {
            
            SchoolGirl girl = new SchoolGirl();
            girl.setName("林风娇");
            
            Proxy p = new Proxy("柯南",girl);
            p.giveChocolate();
            p.giveDolls();
            p.giveFlows();
            System.out.println("--------------");
            
            Proxy p2 = new Proxy("易烊千玺",girl);
            p2.giveChocolate();
            p2.giveDolls();
            p2.giveFlows();
            System.out.println("--------------");
            
            Proxy p3 = new Proxy("王源",girl);
            p3.giveChocolate();
            p3.giveDolls();
            p3.giveFlows();
            System.out.println("--------------");
            
        }
    }

    运行结果:

    下面我们来分析一下代码实现:

    1、Pursuit真实实体实现了接口GiveGift,而Proxy也实现了接口GiveGift,并且代理类还拥有成员变量Pursuit。单单从这代码结构看,是不是和装饰模式有一点相似?

    2、为什么Pursuit实现GiveGift,而Proxy也要去实现GiveGift呢?因为他们两个要做的事情是相同的,房东可以租房子,中介也可以租房子,只是中介是代理房东在操作而已,道理一样!那我想知道,Proxy不去实现GiveGift接口行不行呢?答案是可以的,因为我代码根本就没有出现 @Override字样;即使出现了也没关系,去掉就可以了(建议是去实现GiveGift接口,省事啊

    3、客户端知乎要知道Proxy能租房子就行了,我根本不需要知道Pursuit的实例对象到底是谁,有可能是Pursuit1、2 、3、4、5....N呢,我客户根本不关心,我只需要知道Proxy即可,耦合度大大降低。

    4、再来说说不好的地方,Proxy持有的是Pursuit,那假如我还有其他的实体呢?比如A,B,C,D,如果是这样,仅有的一个Proxy是根本无法代理的,因为在代理类的构造方法中是要实例化具体的实现实体对象的。有人会说,那我多写几个Proxy好了,如果是这样的话,那我有1000个具体实体,那你的Proxy是不是也要有1000个呢?这样的量是面向对象无法接受的;

    5、还有一个不好的地方,刚刚说的是同一个接口的不同实现类;现在如果我有多个接口,每个接口实现类也不同,你又如何去代理,难道还要写多个Proxy?

  • 相关阅读:
    使用js固定div的高度
    iphone开发常用编码
    php mssql扩展SQL查询中文字段名解决方法
    Android带进度条文件上传
    PHP中替换换行符
    Android Timer计时器
    语法:MySQL中INSERT INTO SELECT的使用
    mysql的多表关联更新怎么写?
    Page Utility
    How do use CheckBoxList Utility
  • 原文地址:https://www.cnblogs.com/chen1-kerr/p/7058065.html
Copyright © 2011-2022 走看看