设计模式--5.2 代理模式--普通代理

1. 普通代理就是我们要知道代理类(Subject)的存在,然后才能访问

(1)调用者只知道代理存在就可以, 不用知道代理了谁
(2) 屏蔽了真实角色(RealSubject)的变更对高层类(场景类)的影响

(3)真实的主题角色想怎么修改就怎么修改, 对高层次的模块没有任何的影响,只要你实现了接口所对应的方法, 该模式非常适合对扩展性要求较高的场合。

2.

(1) 接口类

package com.design.代理模式.第一阶段;

public interface IGamePlayer {
    void login(String username , String pwd);

    void killBoss();

    void upgrade();
}    

(2)真实角色

package com.design.代理模式.普通代理;

import com.design.代理模式.第一阶段.IGamePlayer;

public class GamePlayer implements IGamePlayer {
    private String name = "";

    public GamePlayer(IGamePlayer _gamePlayer , String _name) throws Exception{

        // 只有代理才能创建对象
        if(_gamePlayer != null && _gamePlayer.getClass().getName().equals("com.design.代理模式.普通代理.GamePlayerProxy")){
            this.name = _name;

        }else{
            throw new Exception("不能创建真实角色");
        }
    }

    // 登录
    @Override
    public void login(String username, String pwd) {
        System.out.println("GamePlayer:"+ name +" login.....");

    }

    // 杀怪
    @Override
    public void killBoss() {
        System.out.println("GamePlayer:"+ name +" killBoss.....");

    }

    // 升级
    @Override
    public void upgrade() {
        System.out.println("GamePlayer: "+ name +" upgrade.....");

    }

}

(3)proxy

package com.design.代理模式.普通代理;

import com.design.代理模式.第一阶段.IGamePlayer;

public class GamePlayerProxy implements IGamePlayer {
    private IGamePlayer gamePlayer = null;

     public GamePlayerProxy(String name ) throws Exception{
         gamePlayer = new GamePlayer(this,name);
     }

    // 通过构造函数决定要对谁进行代练
    public GamePlayerProxy(IGamePlayer _gamePlayer) {
        super();
        this.gamePlayer = _gamePlayer;
    }

    // 代练登录
    @Override
    public void login(String username, String pwd) {
        this.gamePlayer.login(username, pwd);
    }

    // 代练杀怪
    @Override
    public void killBoss() {
        this.gamePlayer.killBoss();
    }

    // 代练升级
    @Override
    public void upgrade() {
        this.gamePlayer.upgrade();
    }

}

(4) 场景类

package com.design.代理模式.普通代理;

import com.design.代理模式.第一阶段.IGamePlayer;

public class Client {
    public static void main(String[] args) throws Exception {
        // 调用者只知道代理存在就可以, 不用知道代理了谁
        // 屏蔽了真实角色(RealSubject)的变更对场景类的影响
        /*
         * 真实的主题角色想怎么修改就怎么修改, 对高层次的模
            块没有任何的影响, 只要你实现了接口所对应的方法, 该模式非常适合对扩展性要求较高的
            场合。 当然, 在实际的项目中, 一般都是通过约定来禁止new一个真实的角色, 这也是一个
            非常好的方案。
         */
        IGamePlayer proxy = new GamePlayerProxy("lvyf");

        proxy.login("lvyafei", "123456");
        proxy.killBoss();
        proxy.upgrade();
    }
}
时间: 2024-08-10 16:57:53

设计模式--5.2 代理模式--普通代理的相关文章

Java进阶篇设计模式之七 ----- 享元模式和代理模式

前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 用通俗的话来说就是进行共用.生活中也有一些例子,比如之前很火的共享单车,更早之前的图书馆,编程中经常用的String类,数据库连接池等等.当然,享元模式主要的目的是复用,如果该对象没有的话,就会进行创建. 享

设计模式--5.3 代理模式-强制代理

1 .强制代理 (1)强制代理是调用者直接调用真实角色,而不用关心代理类是否存在.其代理的产生是由真实角色决定的. (2) 通过真实角色,查找代理角色:再通过代理角色,调真实角色的方法 2.代码 (1)抽象类,多了一个getProxy方法 package com.design.代理模式.强制代理; public interface IGamePlayer { void login(String username , String pwd); void killBoss(); void upgra

设计模式--5.4 代理模式-动态代理

1.动态代理 (1)动态代理,是实现阶段不关心代理谁,而在运行阶段才指定代理哪一个对象.相对的说,上面两种 普通代理和强制代理,都是通过写代理类来获取代理,这种是静态代理. (2)区别:静态代理,需要写代理类,在代理之前要知道我代理的是哪个类: (3)类图 2.代码 接口类 package com.design.代理模式.动态代理; public interface IGamePlayer { void login(String username , String pwd); void kill

Java代理模式——静态代理模式

一:代理模式 代理模式的作用是:为其他对象提供一种代理以控制这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 二:代理模式设计到的角色 抽象角色:声明真是对象和代理对象的共同接口(抽象类或接口). 代理角色:代理对象角色内部含有对真是对象的引用,从而可以操作真是对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能够代替真是对象.同时,代理对象可以在执行真实对象的操作时,附加其他操作,相当于对真是对象进行封装. 真实

代理模式-静态代理与动态代理

简介 首先感谢沽泡学院 tom 老师 代理模式是一种结构型模式 代理模式就是代理对象帮被代理对象处理一些问题, 类似中介, 客户只要结果, 中介怎么搞是他的事儿, 他可能再处理过程中赚外快什么的 代理模式的应用: spring中的aop, 日常工作中记录日志, 统计时间,权限控制等 这里我们使用一个客户端代理访问google举例, 具体细节可能不合适, 意会.意会.意会... 静态代理 /** * 一个服务器接口, 服务器有很多功能, 可以用来路由, 建站等... */ public inter

设计模式回顾:策略模式、代理模式、装饰者模式的区别

前言 设计模式有很多,但设计模式的目的是一致的,都是为了提升代码的可读性和可扩展性.设计模式都遵循一些基本的原则,设计模式是为了遵循这些原则而创造的工具. - 单一职责原则:就一个类而言,应该仅有一个引起它变化的原因.这一点是说,如果有一些类过于臃肿,承担了过多的职责,就应当分解他. - 开放-封闭原则:软件实体(类.模块.函数等)应该可以扩展,但是不可修改.这一点是说,拒绝硬编码,拒绝直接修改原有代码. - 依赖倒转原则:高层模块不应该以来低层模块.两个都应该以来抽象.抽象不应该依赖细节.细节

java 设计模式 - 代理模式 - 静态代理

代理模式:使用环境无法直接使用对象A(委托对象),可以使用对象B(代理对象)调用对象A已达到直接调用对象A的效果,就成为代理模式. 其中A为委托对象,B为代理对象. 静态代理的优缺点: 优点: 1.代码只管,可以清楚理解委托雷以及代理类. 2.在编译期加入,提前就指定好了委托类,代理类,效率高. 缺点: 1.静态代理很麻烦,需要大量的代理类,不易于代码维护等 当我们有多个目标对象需要代理时,我就需要建立多个代理类,改变原有的代码,改的多了就很有可能出问题,必须要重新测试. 2.重复的代码会出现在

代理模式(静态代理)的通俗理解

代理模式分为两种:静态代理和动态代理. 首先不谈模式,举一个例子: 有一队很美丽的妹子,她们都是训练有素的迎宾小姐.平时忙于训练再加上人脉与广告投入不多,生意并不好.于是她们的老大提议去找一个礼仪公司合作,请他们把迎宾的活儿包给她们来做.恰好在某个公司有个接待外宾的活动,该活动交给一个这个知名的礼仪公司负责,礼仪公司就通知了迎宾小姐.在外宾下车时就要乐队奏乐,走到公司门口时,迎宾小姐需要致以问候.现在来模拟一下这个情景. //相当于迎宾小姐(委托类) public class HelloWorl

代理模式---静态代理

一,静态代理介绍 了解设计模式中的代理模式的同学应该都知道如果想要为被代理类生成代理,需要让代理类和被代理类共同实现同一个接口,在代理类中增加额外逻辑来实现代理模式,这种方式在编译期间就已经确认了哪个类是代理类,被代理的又是哪个类,这都是需要开发人员在编译之前就编写好的,是为静态 1,代理模型的角色分析 抽象角色:一般会使用抽象类或者接口实现 真实角色:实体类,被代理的角色 代理角色:代理真实角色,而且可以附属一些其他操作 使用角色:使用代理角色进行操作 2,静态代理模式的优点 可以使真实角色更