当前位置: 首页 > news >正文

aitt网站建设中网站制作时间

aitt网站建设中,网站制作时间,wordpress这个博客,大沥网站开发10. 代理模式 案例 10.1 静态代理 角色分析 抽象角色:一般使用接口或者抽象类实现。真实角色:被代理的角色。代理角色:代理真实角色,含附属操作。客户:访问代理对象的角色。 租房案例 定义租赁接口 /*** TODO* 租房*…

10. 代理模式

  • 案例

在这里插入图片描述

10.1 静态代理

  • 角色分析

    • 抽象角色:一般使用接口或者抽象类实现。
    • 真实角色:被代理的角色。
    • 代理角色:代理真实角色,含附属操作。
    • 客户:访问代理对象的角色。
  • 租房案例

    • 定义租赁接口

      /*** TODO* 租房* @author why* @since 2021/7/6 9:06*/
      public interface Rent {public void rent();
      }
      
    • 定义真实角色

      /*** TODO* 房东* @author why* @since 2021/7/6 9:10*/
      public class Landlord implements Rent {public void rent() {System.out.println("房东要出租房子");}
      }
      
    • 定义代理角色

      /*** TODO* 中介* @author why* @since 2021/7/6 9:14*/
      public class Proxy implements Rent {private Landlord landlord;public Proxy() {}public Proxy(Landlord landlord) {this.landlord = landlord;}/*** 出租房子*/public void rent() {seeHouse();landlord.rent();signContract();fee();}/*** 看房*/public void seeHouse(){System.out.println("中介带租客看房");}/*** 收中介费*/public void fee(){System.out.println("收中介费");}/*** 签合同*/public void signContract(){System.out.println("签租赁合同");}}
      
    • 客户端访问代理角色

      /*** TODO* 租客* @author why* @since 2021/7/6 9:12*/
      public class Client {public static void main(String[] args) {// 房东想要出租房子Landlord landlord = new Landlord();// 中介帮助房东出租房子,包含了附加操作Proxy proxy = new Proxy(landlord);// 租客找中介租房子proxy.rent();}
      }
      
  • 模式优点

    • 可以使真实角色的操作更加纯粹,不必关注一些公共业务。
    • 公共业务交给代理角色,实现了业务的分工。
    • 公共业务发生扩展时,方便集中管理。
  • 模式缺点

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

    • 抽象 AOP 机制

      在这里插入图片描述

    • 定义用户操作接口

      /*** TODO* 用户服务接口* @author why* @since 2021/7/6 9:38*/
      public interface UserService {public void add();public void delete();public void update();public void query();
      }
      
    • 定义业务操作实现类

      /*** TODO* 用户接口实现类(真实对象)* @author why* @since 2021/7/6 9:40*/
      public class UserServiceImpl implements UserService {public void add() {System.out.println("增加一个用户");}public void delete() {System.out.println("删除一个用户");}public void update() {System.out.println("修改一个用户");}public void query() {System.out.println("查询一个用户");}
      }
      
    • 定义代理

      /*** TODO* 代理* @author why* @since 2021/7/6 9:57*/
      public class UserServiceProxy implements UserService {private UserService userService;public void setUserService(UserService userService) {this.userService = userService;}public void add() {log("add");userService.add();}public void delete() {log("delete");userService.delete();}public void update() {log("update");userService.update();}public void query() {log("query");userService.query();}// 日志方法public void log(String msg) {System.out.println("[Debug] 使用了"+ msg +"方法");}
      }
      
    • 定义客户端

      /*** TODO* 客户端* @author why* @since 2021/7/6 9:44*/
      public class Client {public static void main(String[] args) {UserServiceImpl userService = new UserServiceImpl();UserServiceProxy userServiceProxy = new UserServiceProxy();userServiceProxy.setUserService(userService);userServiceProxy.add();}
      }
      

10.2 动态代理

  • 动态代理和静态代理的角色一样

  • 动态代理的代理类是动态生成的,不需要编写。

  • 动态代理分为基于接口的动态代理和基于类的动态代理。

    • 基于接口 — JDK 动态代理
    • 基于类 — CGLIB
    • Java 字节码实现 — Javasist
  • 租房案例

    • 定义租赁接口

      /*** TODO* 租房* @author why* @since 2021/7/6 9:06*/
      public interface Rent {public void rent();
      }
      
    • 定义真实角色(房东)

      /*** TODO* 房东* @author why* @since 2021/7/6 9:10*/
      public class Landlord implements Rent {public void rent() {System.out.println("房东要出租房子");}
      }
      
    • 构造代理类生成器

      /*** TODO* 自动生成代理类* @author why* @since 2021/7/6 13:43*/
      public class ProxyInvocationHandler implements InvocationHandler {// 被代理的接口private Rent rent;public void setRent(Rent rent) {this.rent = rent;}// 获得代理类public Object getProxy(){return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent.getClass().getInterfaces(), this);}// 处理代理实例并返回结果public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 动态代理由反射机制实现Object result = method.invoke(rent, args);return result;}
      }
      
    • 定义客户端

      /*** TODO* 客户端* @author why* @since 2021/7/6 13:54*/
      public class Client {public static void main(String[] args) {// 真实角色Landlord landlord = new Landlord();// 代理角色(由 InvocationHandler 获取)ProxyInvocationHandler pih = new ProxyInvocationHandler();// 通过调用处理程序处理要调用的接口对象pih.setRent(landlord);Rent proxy = (Rent) pih.getProxy();proxy.rent();}
      }
      
  • 模式优点

    • 可以使真实角色的操作更加纯粹,不必关注一些公共业务。
    • 公共业务交给代理角色,实现了业务的分工。
    • 公共业务发生扩展时,方便集中管理。
    • 一个动态代理类代理的是一个接口,一般就是一类业务。
    • 一个动态代理可以代理多个类,前提是这些类实现了同一个接口。
  • 业务模拟

    • 定义用户操作接口

      /*** TODO* 用户服务接口* @author why* @since 2021/7/6 9:38*/
      public interface UserService {public void add();public void delete();public void update();public void query();
      }
      
    • 定义业务操作实现类

      /*** TODO* 用户接口实现类(真实对象)* @author why* @since 2021/7/6 9:40*/
      public class UserServiceImpl implements UserService {public void add() {System.out.println("增加一个用户");}public void delete() {System.out.println("删除一个用户");}public void update() {System.out.println("修改一个用户");}public void query() {System.out.println("查询一个用户");}
      }
      
    • 定义代理生成器

      /*** TODO* 自动生成代理类* @author why* @since 2021/7/6 13:43*/
      public class ProxyInvocationHandler implements InvocationHandler {// 被代理的接口private Object target;public void setTarget(Object target) {this.target = target;}// 获得代理类public Object getProxy(){return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);}// 处理代理实例并返回结果public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {log(method.getName());// 动态代理由反射机制实现return method.invoke(target, args);}public void log(String msg){System.out.println("执行了" + msg + "方法");}
      }
      
    • 定义客户端

      /*** TODO* 客户端* @author why* @since 2021/7/6 15:00*/
      public class Client {public static void main(String[] args) {UserServiceImpl userService = new UserServiceImpl();ProxyInvocationHandler pih = new ProxyInvocationHandler();pih.setTarget(userService);UserService proxy = (UserService) pih.getProxy();proxy.add();}
      }
      

http://www.yayakq.cn/news/920733/

相关文章:

  • 内蒙网站建设赫伟创意星空科技重庆公众通
  • 如何做网络营销推广ppt如何进行seo搜索引擎优化
  • 襄阳市住房城乡建设部网站网站项目计划书范文
  • 单页网站怎么制作教程seo技术是干什么的
  • 延吉有没有做网站的建设小学网站
  • 西安中交建设集团网站负面网页升级访问
  • 手机微信网站模板实体店铺引流推广方法
  • 做门户网站难吗做牛津布面料在哪个网站找客户
  • 游戏app平台排行榜seo做的最好的十个网站
  • 青岛商网站建设整容医院网络建设公司
  • 计算机网站开发面试问题及答案畅言wordpress
  • 做外贸通常用哪些网站网站如何做备份
  • 2008 iis 添加网站网站建设 应该付多少维护费呢
  • 网站怎么推广效果好flash+xml地图网站
  • 上海创意型网站建设免费十八种禁用网站
  • 微信商城和微网站建设wordpress支持系统
  • 沧州网站建设报价wordpress 远程代码
  • 企业网站带后台做公众号推送的网站
  • 政务公开与网站建设工作总结存在问题和困难网络服务机构的域名是什么
  • 阳光保险网站辽宁建设工程信息网 管网
  • 网站一年的费用上海住房与建设部网站
  • 哪个网站反盗版做的最好应用商店aso优化
  • 网站建设服务器选择做58同城网站花了多少钱
  • 网站空间在哪申请零基础源码建设网站
  • 可以做试卷的网站英语淘宝怎么优化关键词步骤
  • 高端企业网站公司网站设计就业压力
  • 无锡网站设1688黄页网品种大全2021
  • 一页式网站模板怎样把自己做的网站发到网上
  • 网站优化公司多少钱12380举报网站建设经验
  • 做南美生意做什么网站好企业网站建设的四大因素