23种设计模式-静态代理模式

 

代理模式的分类:

 

  • 静态代理

  • 动态代理  

  1. 接口

     //租房
     public interface Rent {
         public void rent();
     }
  2. 真实角色

     //房东
     public class Host implements Rent {
         public void rent(){
             System.out.println("房东要出租房子!");
        }
     }
  3. 代理角色    通过组合的方式 将房东带进来

     public class Proxy implements Rent {
         private Host host;
     
         public Proxy() {
        }
         public Proxy(Host host) {
             this.host = host;
        }
     
         public void rent(){
             seeHouse();
             host.rent();
             hetong();
             fee();
        }
         //看房
         public void seeHouse(){
             System.out.println("中介带你看房");
        }
         //签合同
         public void hetong(){
             System.out.println("签合同");
        }
         //收费
         public void fee(){
             System.out.println("收取中介费用");
        }
     }
  4. 客户端访问

     public class Client {
         public static void main(String[] args) {
             //房东要租房子
             Host host = new Host();
             //代理,中介帮房东租房子,但是呢?代理角色一般会有一些附属操作!
             Proxy proxy = new Proxy(host);
             proxy.rent();
        }
     }

 

代理模式的好处:

  • 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务

  • 公共也就交给代理角色!实现了业务的分工!

  • 公共业务发生扩展的时候,方便集中管理!

缺点:

  • 一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率会变低

加深理解

 一个接口类

package com.kuang.demo02;

public interface UserService {

    public void add();
    public void delete();
    public void update();
    public void query();
}

接口实现类

package com.kuang.demo02;
//真实对象
public class UserServiceImpl implements UserService {
    @Override
    public void add() {
        System.out.println("增加了一个用户!");
    }

    @Override
    public void delete() {
        System.out.println("删除了一个用户!");
    }

    @Override
    public void update() {
        System.out.println("修改了一个用户!");
    }

    @Override
    public void query() {
        System.out.println("查询了一个用户!");
    }
}

在原有的基础上想增加一个日志的功能 根据oop七大原则里 这里可以使用动态代理模式

一个代理类

package com.kuang.demo02;

import java.security.PublicKey;

public class UserServiceProxy implements UserService {
//代理 需要代理真实的对象 这里引入真实的对象
   private   UserServiceImpl userService;

    public void setUserService(UserServiceImpl userService) {
        this.userService = userService;
    }

    @Override
    public void add() {
        log("add");
        userService.add();
    }

    @Override
    public void delete() {
        log("delete");
        userService.delete();
    }

    @Override
    public void update() {
        log("update");
        userService.update();
    }

    @Override
    public void query() {
        log("query");
        userService.query();
    }
//    日志方法

    public void log(String msg){
        System.out.println("[debug]使用了"+"方法!");

    }
}

测试类

package com.kuang.demo02;

public class Client {
    public static void main(String[] args) {
        UserServiceImpl userService = new UserServiceImpl();

        UserServiceProxy proxy =new UserServiceProxy();
        proxy.setUserService(userService);
        proxy.add();
    }
}

猜你喜欢

转载自www.cnblogs.com/yppaopao/p/13171383.html