java学习(178):终篇?静态代理?动态代理?

总体设计

包com.xzit.aop

 


  • Dynlnvoke
  • ProducerProxy

包com.xzit.db


  • db

包com.xzit.entity


  • Client
  • Department
  • Employee
  • Goods
  • Producer

包com.xzit.interfaces


  • DepartmentDaoImp
  • EmployeeDaoImp
  • IGoods
  • IObject

包com.xzit.proxy


  • TeatDynProxy
  • TestStaticProxy

咱直接上代码,附一张图,如果看到这里,我希望你看完,我是歌谣,期待一起共同进步

工具:IDEA

package:aop

Dynlnvoke类

package com.xzit.aop;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class DynInvoke implements InvocationHandler {private Object target; // 被代理的对象/*** 重写实现动态代理的invoke方法*/public Object invoke(Object arg0, Method arg1, Object[] arg2)throws Throwable {System.out.println("动态代理方法");Object obj = arg1.invoke(target, arg2);return obj;}public void setTarget(Object target) {this.target = target;}}

ProducerProxy类

package com.xzit.aop;import java.util.List;import com.xzit.entity.Client;
import com.xzit.entity.Goods;
import com.xzit.entity.Producer;
import com.xzit.interfaces.IGoods;public class ProducerProxy implements IGoods {private Producer producer; // 被代理对象private Client client;// 购买对象public List<Goods> produerGoodsList() {boolean bool = validateIsVip();if(bool){List<Goods> goodsList = producer.produerGoodsList();for(Goods g:goodsList){g.setPrice(g.getPrice()*0.85);}return goodsList;}return producer.produerGoodsList();}public void setProducer(Producer producer) {this.producer = producer;}public void setClient(Client client) {this.client = client;}private boolean validateIsVip(){if(client.isVip())return true;return false;} }

package:db

db类

package com.xzit.db;import java.util.ArrayList;
import java.util.List;import com.xzit.entity.Department;
import com.xzit.entity.Employee;
import com.xzit.entity.Goods;public class DataBase {public static final List<Department> DEPLIST = new ArrayList<Department>();public static final List<Employee> EMPLIST = new ArrayList<Employee>();public static final List<Goods> GOODSLIST = new ArrayList<Goods>();static{DEPLIST.add(new Department("dep100","事业部"));DEPLIST.add(new Department("dep200","策划部"));DEPLIST.add(new Department("dep300","市场部"));DEPLIST.add(new Department("dep400","人事部"));DEPLIST.add(new Department("dep500","研发部"));DEPLIST.add(new Department("dep600","测试部"));EMPLIST.add(new Employee("任我行","男","黑木崖"));EMPLIST.add(new Employee("任盈盈","女","黑木崖"));EMPLIST.add(new Employee("令狐冲","男","华山"));EMPLIST.add(new Employee("岳不群","男","华山"));EMPLIST.add(new Employee("丁春秋","男","南海"));GOODSLIST.add(new Goods("goods100","加热器",123.50));GOODSLIST.add(new Goods("goods200","胜利羽毛球lark4",54.00));GOODSLIST.add(new Goods("goods300","联想笔记本T450",8900.50));GOODSLIST.add(new Goods("goods400","小米麦克风",99.50));}
}

package:entity

Client类

package com.xzit.entity;/*** 客户实体类* @author Administrator**/
public class Client {private String name; // 客户姓名private boolean isVip; // 是否是VIP客户public String getName() {return name;}public void setName(String name) {this.name = name;}public boolean isVip() {return isVip;}public void setVip(boolean isVip) {this.isVip = isVip;}
}

Department类

package com.xzit.entity;
/*** 部门信息实体类* @author Administrator**/
public class Department {private String number;// 部门编号private String name;// 部门名称public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Department() {}public Department(String number, String name) {this.number = number;this.name = name;}
}

Emploee类

package com.xzit.entity;
/*** 员工实体类* @author Administrator**/
public class Employee {private String name;private String sex;private String address;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}/*** 无参构造器*/public Employee() {}/*** 有参构造器* @param name* @param sex* @param address*/public Employee(String name, String sex, String address) {this.name = name;this.sex = sex;this.address = address;}
}

Goods类

package com.xzit.entity;
/*** 商品实体类* @author Administrator**/
public class Goods {private String number;// 商品编号private String name;// 商品名称private Double price; // 商品单价public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}public Goods() {}public Goods(String number, String name, Double price) {this.number = number;this.name = name;this.price = price;}
}

Producer类

package com.xzit.entity;import java.util.List;import com.xzit.db.db.DataBase;
import com.xzit.interfaces.IGoods;
/*** 生产商* @author Administrator**/
public class Producer implements IGoods {public List<Goods> produerGoodsList() {return DataBase.GOODSLIST;}}

package:interfaces

DepartmentDaoImp类

package com.xzit.interfaces;import java.util.List;import com.xzit.db.db.DataBase;public class DepartmentDaoImp<T> implements IObject<T> {public List<T> findList() {System.out.println("获取部门列表");return (List<T>) DataBase.DEPLIST;}}

EmployeeDaoImp类

package com.xzit.interfaces;import java.util.List;import com.xzit.db.db.DataBase;public class EmployeeDaoImp<T> implements IObject<T> {public List<T> findList() {System.out.println("获取员工列表");return (List<T>) DataBase.EMPLIST;}}

IGoods

package com.xzit.interfaces;import java.util.List;import com.xzit.entity.Goods;/*** 提供产品列表的接口* 代理实现者和被代理对象都应该实现此接口* @author Administrator**/
public interface IGoods {/*** 提供产品的方法* @return*/List<Goods> produerGoodsList();
}

IObject

package com.xzit.interfaces;import java.util.List;public interface IObject<T> {/*** 查找目标数据列表* @return*/List<T> findList();
}

package:proxy

TeatDynProxy

package com.xzit.proxy;import java.lang.reflect.Proxy;
import java.util.List;import com.xzit.aop.DynInvoke;
import com.xzit.entity.Department;
import com.xzit.entity.Employee;
import com.xzit.interfaces.DepartmentDaoImp;
import com.xzit.interfaces.EmployeeDaoImp;
import com.xzit.interfaces.IObject;public class TestDynProxy {/*** 动态代理测试* @param args*/public static void main(String[] args) {DynInvoke dynInovke = new DynInvoke();// 创建动态代理对象DepartmentDaoImp<Department> depDao = new DepartmentDaoImp<Department>();// 创建被代理的目标对象EmployeeDaoImp<Employee> empDao = new EmployeeDaoImp<Employee>();//dynInovke.setTarget(depDao);// 设置被代理对象dynInovke.setTarget(empDao);// 设置被代理对象Class [] classes = depDao.getClass().getInterfaces();// 获取所有被代理对象的父接口数组IObject iObject = (IObject)Proxy.newProxyInstance(empDao.getClass().getClassLoader(), classes,dynInovke);// 获取代理类实例List<Employee> depList = iObject.findList();// 调用目标方法for(Employee dep:depList){System.out.println(dep.getName());}}}

TestStaticProxy

package com.xzit.proxy;import java.util.List;
import java.util.Scanner;import com.xzit.aop.ProducerProxy;
import com.xzit.entity.Client;
import com.xzit.entity.Goods;
import com.xzit.entity.Producer;public class TestStaticProxy {public static void main(String[] args) {Scanner in = new Scanner(System.in);ProducerProxy proxy = new ProducerProxy();// 代理实现者proxy.setProducer(new Producer());System.out.println("输入客户姓名");String name = in.next();System.out.println("您是VIP请输入1,否则输入 0");int isVip = in.nextInt();boolean bool = isVip == 1?true:false;Client c = new Client();c.setName(name);c.setVip(bool);proxy.setClient(c);List<Goods> goodsList = proxy.produerGoodsList();// 调用代理实现方法for(Goods g:goodsList){System.out.println(g.getName()+"\t"+g.getNumber()+"\t"+g.getPrice());}}}

运行结果

动态代理方法

动态代理方法
获取员工列表
任我行
任盈盈
令狐冲
岳不群
丁春秋

静态代理方法

输入客户姓名
歌谣
您是VIP请输入1,否则输入 0
1
加热器	goods100	104.975
胜利羽毛球lark4	goods200	45.9
联想笔记本T450	goods300	7565.425
小米麦克风	goods400	84.575

本人来博客已经两月有余,期待与大家共同进步。分享技术,分享快乐。我是歌谣,感谢关注。

如果你看到这篇文章,请留下你的鼓励,谢谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425823.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]

【问题描述】[] 前序遍历 先输出当前结点的数据&#xff0c;再依次遍历输出左结点和右结点 中序遍历 先遍历输出左结点&#xff0c;再输出当前结点的数据&#xff0c;再遍历输出右结点 后续遍历 先遍历输出左结点&#xff0c;再遍历输出右结点&#xff0c;最后输出当前结点的数…

sqlserver:(2):window下SQL server数据库数据源的配置

1首先打开控制面板 2选择64位数据源 3添加 4选择sql server 做好配置&#xff0c;下一步 下一步 下一步 测试

聚类算法:K-Means

1.K-Means定义&#xff1a; K-Means是一种无监督的基于距离的聚类算法&#xff0c;简单来说&#xff0c;就是将无标签的样本划分为k个簇&#xff08;or类&#xff09;。它以样本间的距离作为相似性的度量指标&#xff0c;常用的距离有曼哈顿距离、欧几里得距离和闵可夫斯基距离…

html:(1) 登录界面

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><!-- content属性值 :width:可视区域的宽度&#xff0c;值可为数字或关键词device-widthheight:同widthintial-scale:页面首次被显示是可视区域的缩放级别&#x…

[Leedcode][JAVA][第5题][最长回文子串][数组][动态规划]

【问题描述】[第5题][最长回文子串][中等] 给定一个字符串 s&#xff0c;找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1&#xff1a;输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。【解答思路】 1. 中心扩展法…

一流大学计算机专业,计算机专业一流大学太难考,不妨退而求其次,看看这5所大学...

原标题&#xff1a;计算机专业一流大学太难考&#xff0c;不妨退而求其次&#xff0c;看看这5所大学因为就业率高、薪酬待遇好&#xff0c;又是前沿科技&#xff0c;所以计算机专业近一二十年来一直都很热门&#xff0c;开设计算机专业的院校也如雨后春笋一般冒了出来&#xff…

[Leedcode][JAVA][第560题][和为K的子数组][Hashmap][数组]

【问题描述】[第560题][和为K的子数组][中等] 给定一个整数数组和一个整数 k&#xff0c;你需要找到该数组中和为 k 的连续的子数组的个数。示例 1 :输入:nums [1,1,1], k 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。 说明 :数组的长度为 [1, 20,000]。 数组中元素的范围…

html表格复制最后一行字,为什么Word中的表格输入文字最后一行文字会自动跳到下一页...

为什么Word中的表格输入文字最后一行文字会自动跳到下一页以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;为什么Word中的表格输入文字最后一行文字会自动跳到下一页, 在WPS文字中的表格中打…

购物车的基本流程

一、购物车的需求描述和基本流程1、需求描述1、 用户可以在登录状态下将商品添加到购物车 2、 用户可以在未登录状态下将商品添加到购物车 3、 用户可以使用购物车一起结算下单 4、 用户可以查询自己的购物车 5、 用户可以在购物车中可以修改购买商品的数量。 6、 用户可以在购…

canvas填充规则

canvas填充规则 const canvas document.getElementById(canvas); const ctx canvas.getContext(2d);ctx.beginPath(); ctx.fillStylegreen ctx.arc(50, 50, 30, 0, Math.PI * 2, true); ctx.arc(50, 50, 20, 0, Math.PI * 2, true); ctx.arc(50, 50, 15, 0, Math.PI * 2, tr…

1.web技术的前世今生

目录 1web Web服务器 Web页面 Web的作用 所谓Web 2web技术 分类主流 Web技术 工作原理 Web服务器 •1990年&#xff0c;第一个Web服务器开始 运行 •网站服务器 •站点服务器 •本质上是一个软件系统 •安装了web服务器软件的计算机 为什么没有流传 •操作太复杂…

计算机科学中的研究成果,田聪教授团队科研成果在计算机科学顶会LICS 2020发表...

(通讯员 王文胜)第35届ACM/IEEE计算机科学逻辑国际会议(ACM/IEEE Symposium on Logic in Computer Science,http://lics.siglog.org/lics20/)&#xff0c;简称LICS 2020&#xff0c;于7月08日—7月11日在线举行(主会场设在德国萨尔布吕肯)。该会议是理论计算机科学领域最顶级的…

[Leedcode][JAVA][第25题][K个一组反转链表][链表][递归]

【问题描述】[第25题][K个一组反转链表][困难] 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(1) java 给你一个链表&#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回翻转后的链表。k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数…

2.jsp初识

目录 什么是jsp jsp的特点 早期的网站一般是用标准的HTML文件也 就是静态网页制作的&#xff0c;通常没有后台数据库、 不能和用户交互&#xff0c;内容更新起来相对也比较 麻烦&#xff0c;适用于一些不需要经常更新的展示型 网站。而动态网页上显示的内容不是固定的&#x…

武大计算机专业湖北录取分数线,武汉大学2020年本科一批分专业录取分数统计(湖北省)...

2020年高考已经过去&#xff0c;为给2021年的高考生们提供一些报考资料&#xff0c;我们将逐一推出一些重点大学在全国各省分专业的录取分数。本文先介绍武汉大学2020年在湖北省本科一批的录取情况。武汉大学始建于1893年&#xff0c;是国家教育部直属重点大学&#xff0c;国家…

[Leedcode][JAVA][第210 题][课程表 II][拓扑排序][BFS][DFS][有向图]

【问题描述】[第210 题][课程表 II][中等] 现在你总共有 n 门课需要选&#xff0c;记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如&#xff0c;想要学习课程 0 &#xff0c;你需要先完成课程 1 &#xff0c;我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的…

牛客小白月赛11 Rinne Loves Xor

题目链接&#xff1a;https://ac.nowcoder.com/acm/contest/370/I code: #include<bits/stdc.h> using namespace std; typedef unsigned long long ll; ll mod1e97; ll pow(ll x,ll n,ll mod) {ll res1;while(n>0){if(n%21){resres*x;resres%mod;}xx*x;xx%mod;n>&…

HDU - 2571 

穿过幽谷意味着离大魔王lemon已经无限接近了&#xff01; 可谁能想到&#xff0c;yifenfei在斩杀了一些虾兵蟹将后&#xff0c;却再次面临命运大迷宫的考验&#xff0c;这是魔王lemon设下的又一个机关。要知道&#xff0c;不论何人&#xff0c;若在迷宫中被困1小时以上&#xf…

3.JSP开发探秘

目录 1JSP工作原理 2JSP设计模式 3JSP开发方式 用户通过浏览器提交请求&#xff0c;服务器端收到请求后进行处理&#xff0c;再以HTML的形式把处理结果返 回给客户端&#xff0c;客户端通过浏览器查看得到的静态网页。 如果JSP程序是第一次被加载&#xff0c;会首先被编…

[Leedcode][JAVA][第152题][乘积最大子数组][动态规划]

【问题描述】[中等] 给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的连续子数组&#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2:输入:…