zoukankan      html  css  js  c++  java
  • 设计模式--代理模式

    代理模式:

    为其他对象提供一种代理以控制这个对象的访问。

    组成:

    •  抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
    • 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作,对真实角色加以控制。
    • 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

    优点:

    • 职责明确:真实角色可以只做业务逻辑,其他控制可以用代理类完成
    • 保护和控制真实角色:代理类作为调用者和真实角色的中介,可以有效的保护和控制真实角色。
    • 容易控制:可以扩展不同的代理类,实现不同的目的,不需要修改真实角色的业务类。

    缺点:

      增加复杂度,多一个中介,降低速度

    类图:

    应用例子:

    比如,你想追求一个女孩子,送礼物给她,但是你要先搞定她的闺蜜,闺蜜就相当于你的代理,闺蜜还可以看你表现控制是否送礼物给她。

    下面是实现代码:

    例子代码:

    public class Girl {
        private String name;
    
        public Girl(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    public interface GiveGift {
        void giveFlower(Girl girl);
        void giveDolls(Girl girl);
    
    }
    public class Suitor implements GiveGift {
        @Override
        public void giveFlower(Girl girl) {
            System.out.println("送给"+girl.getName()+"一朵花!");
        }
    
        @Override
        public void giveDolls(Girl girl) {
            System.out.println("送给"+girl.getName()+"一个洋娃娃!");
        }
    }
    public class Proxy implements GiveGift {
        /**
         * 追求者
         */
        private Suitor suitor = new Suitor();
    
        @Override
        public void giveFlower(Girl girl) {
            if(new Random().nextBoolean()){
                suitor.giveFlower(girl);
            }
        }
    
        @Override
        public void giveDolls(Girl girl) {
            suitor.giveDolls(girl);
        }
    }
    public class Test {
        public static void main(String[] args) {
            Girl girl = new Girl("坨坨");
            GiveGift proxy = new Proxy();
            proxy.giveFlower(girl);
            proxy.giveDolls(girl);
        }
    }

    最终效果:

  • 相关阅读:
    [bzoj1613 Usaco2007 Jan]Running贝茜的晨练计划
    [bzoj1600][Usaco2008 Oct]建造栅栏
    [bzoj3208]花神的秒题计划I
    [vijos1011]滑雪
    [noip2007 pjt3] 守望者的逃离
    DP(1) 背包
    快速幂 模板及应用
    BZOJ1303: [CQOI2009]中位数图
    BZOJ1083: [SCOI2005]繁忙的都市
    Bzoj1084: [SCOI2005]最大子矩阵
  • 原文地址:https://www.cnblogs.com/foreverYoungCoder/p/7804502.html
Copyright © 2011-2022 走看看