番禺制作网站开发,购物网站设计公司,合肥瑶海区邮政编码,wordpress上下页翻页文章目录 享元模式1.引出享元模式1.展示网站项目需求2.传统方案解决3.问题分析 2.享元模式1.基本介绍2.原理类图3.外部状态和内部状态4.类图5.代码实现1.AbsWebSite.java 抽象的网站2.ConcreteWebSite.java 具体的网站#xff0c;type属性是内部状态3.WebSiteFactory.java 网站… 文章目录 享元模式1.引出享元模式1.展示网站项目需求2.传统方案解决3.问题分析 2.享元模式1.基本介绍2.原理类图3.外部状态和内部状态4.类图5.代码实现1.AbsWebSite.java 抽象的网站2.ConcreteWebSite.java 具体的网站type属性是内部状态3.WebSiteFactory.java 网站工厂根据类型获取对应类型的网站4.User.java 使用网站的用户是外部状态5.Client.java6.结果 6.小结 3.享元模式在Integer的应用 代理模式1.基本介绍1.介绍2.简单类图 2.静态代理1.基本介绍2.类图3.代码实现1.目录结构2.ITeacherDao.java 被代理的接口3.TeacherDao.java 被代理的实现类4.TeacherDaoProxy.java 静态代理类5.Client.java6.结果 2.动态代理JDK代理1.基本介绍2.类图3.代码实现1.ITeacherDao.java 被代理的接口2.TeacherDao.java 被代理的类3.ProxyFactory.java 代理工厂返回动态代理对象4.Client.java5.结果 3.Cglib代理1.基本介绍2.注意事项3.类图4.引入四个jar包5.代码实现1.目录结构2.TeacherDao.java 被代理的类3.ProxyFactory.java 返回代理对象的工厂4.Client.java5.结果 6.几种变体 享元模式
1.引出享元模式
1.展示网站项目需求 2.传统方案解决 3.问题分析 2.享元模式
1.基本介绍 2.原理类图 3.外部状态和内部状态 4.类图 5.代码实现
1.AbsWebSite.java 抽象的网站
package com.sun;/*** Description: 抽象的网站* Author sun* Create 2024/6/6 19:45* Version 1.0*/
public abstract class AbsWebSite {public abstract void use(User user);
}2.ConcreteWebSite.java 具体的网站type属性是内部状态
package com.sun;/*** Description: 具体的网站* Author sun* Create 2024/6/6 19:46* Version 1.0*/
public class ConcreteWebSite extends AbsWebSite {// 网站的发布类型private String type ;// 在创建网站时把具体的类型传进来public ConcreteWebSite(String type) {this.type type;}Overridepublic void use(User user) {System.out.println(网站的发布类型为 type user.getName() 在使用中);}
}3.WebSiteFactory.java 网站工厂根据类型获取对应类型的网站
package com.sun;import java.util.HashMap;/*** Description: 网站的工厂类根据需求返回一个具体的网站* Author sun* Create 2024/6/6 19:49* Version 1.0*/
public class WebSiteFactory {// 一个集合充当池的作用private HashMapString, ConcreteWebSite pool new HashMap();public AbsWebSite getWebsiteCategory(String type) {// 如果池中没有包含对应类型的对象就创建一个对象放到池中if (!pool.containsKey(type)) {pool.put(type, new ConcreteWebSite(type));}// 只要到这里了就必然可以拿到对象return (AbsWebSite) pool.get(type);}// 获取池中的网站总数public int getWebSiteCount() {return pool.size();}
}4.User.java 使用网站的用户是外部状态
package com.sun;/*** Description: 享元模式中的外部状态* Author sun* Create 2024/6/6 20:12* Version 1.0*/
public class User {private String name;public User(String name) {this.name name;}public String getName() {return name;}public void setName(String name) {this.name name;}
}5.Client.java
package com.sun;/*** Description:* Author sun* Create 2024/6/6 20:02* Version 1.0*/
public class Client {public static void main(String[] args) {// 创建一个工厂类WebSiteFactory webSiteFactory new WebSiteFactory();// 要一个以新闻形式发布的网站AbsWebSite webSite webSiteFactory.getWebsiteCategory(新闻);webSite.use(new User(tom));// 要一个以博客形式发布的网站后面即使要更多相同类型的网站都会直接从池中获取而不会创建新的实例AbsWebSite webSite2 webSiteFactory.getWebsiteCategory(博客);webSite2.use(new User(jack));AbsWebSite webSite3 webSiteFactory.getWebsiteCategory(博客);webSite3.use(new User(lisa));AbsWebSite webSite4 webSiteFactory.getWebsiteCategory(博客);webSite4.use(new User(milan));int webSiteCount webSiteFactory.getWebSiteCount();System.out.println(webSiteCount webSiteCount);}
}6.结果 6.小结 3.享元模式在Integer的应用 代理模式
1.基本介绍
1.介绍 2.简单类图 2.静态代理
1.基本介绍 2.类图 3.代码实现
1.目录结构 2.ITeacherDao.java 被代理的接口
package com.sun.staticproxy;/*** Description: 接口* Author sun* Create 2024/6/7 19:05* Version 1.0*/
public interface ITeacherDao {void teach();
}3.TeacherDao.java 被代理的实现类
package com.sun.staticproxy;/**TeacherDaoProxy.java* Description: 实现类* Author sun* Create 2024/6/7 19:06* Version 1.0*/
public class TeacherDao implements ITeacherDao{Overridepublic void teach() {System.out.println(老师正在授课中);}
}4.TeacherDaoProxy.java 静态代理类
package com.sun.staticproxy;/*** Description: 代理TeacherDao* Author sun* Create 2024/6/7 19:06* Version 1.0*/
public class TeacherDaoProxy implements ITeacherDao{// 使用构造器进行聚合private ITeacherDao teacherDao;public TeacherDaoProxy(ITeacherDao teacherDao) {this.teacherDao teacherDao;}Overridepublic void teach() {System.out.println(代理开始);teacherDao.teach();System.out.println(代理结束);}
}5.Client.java
package com.sun.staticproxy;/*** Description:* Author sun* Create 2024/6/7 19:11* Version 1.0*/
public class Client {public static void main(String[] args) {TeacherDaoProxy teacherDaoProxy new TeacherDaoProxy(new TeacherDao());teacherDaoProxy.teach();}
}6.结果 2.动态代理JDK代理
1.基本介绍 2.类图 3.代码实现
1.ITeacherDao.java 被代理的接口
package com.sun.dynamic;/*** Description: 被代理的接口* Author sun* Create 2024/6/7 19:25* Version 1.0*/
public interface ITeacherDao {void teach(String name);}2.TeacherDao.java 被代理的类
package com.sun.dynamic;/*** Description: 实现类* Author sun* Create 2024/6/7 19:06* Version 1.0*/
public class TeacherDao implements ITeacherDao {Overridepublic void teach(String name) {System.out.println(name 老师正在授课中);}}3.ProxyFactory.java 代理工厂返回动态代理对象
package com.sun.dynamic;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;/*** Description: 动态代理对象可以对其代理的对象的任意方法添加任意操作* Author sun* Create 2024/6/7 19:27* Version 1.0*/
public class ProxyFactory {// 构造器聚合一个目标对象private Object target;public ProxyFactory(Object target) {this.target target;}// 给目标对象生成一个代理对象public Object getProxyInstance() {/*** 参数说明* ClassLoader loader:指定当前目标对象使用的类加载器* Class?[] interfaces:是目标对象实现的接口类型使用泛型方法确认类型* InvocationHandler h:是事件处理当使用代理对象调用目标对象的方法时会触发*/return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {/*** method目标方法的Method对象可以用来调用目标任何方法* args目标方法的参数也就是动态代理对象调用目标任何方法时传入的参数* return 返回调用目标方法的返回值也可以返回null* throws Throwable*/Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(method method , args Arrays.toString(args));System.out.println(动态代理开始);/*invoke方法的第一个参数是目标对象第二个参数的目标方法的参数*/Object result method.invoke(target, args);System.out.println(动态代理结束);return result;}});}
}4.Client.java
package com.sun.dynamic;/*** Description:* Author sun* Create 2024/6/7 19:47* Version 1.0*/
public class Client {public static void main(String[] args) {// 创建一个目标对象ITeacherDao target new TeacherDao();// 得到代理对象ITeacherDao proxy (ITeacherDao) new ProxyFactory(target).getProxyInstance();// 使用代理对象调用方法proxy.teach(李华);}
}5.结果 3.Cglib代理
1.基本介绍 2.注意事项 3.类图 4.引入四个jar包 5.代码实现
1.目录结构 2.TeacherDao.java 被代理的类
package com.sun.cglib;/*** Description: 被代理的类* Author sun* Create 2024/6/8 19:37* Version 1.0*/
public class TeacherDao {public void teach(String name) {System.out.println(name 老师授课中使用的是cglib代理不需要实现接口);}
}3.ProxyFactory.java 返回代理对象的工厂
package com.sun.cglib;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/*** Description:* Author sun* Create 2024/6/8 19:38* Version 1.0*/
public class ProxyFactory implements MethodInterceptor {// 构造器聚合一个目标对象private Object target;public ProxyFactory(Object target) {this.target target;}// 返回目标对象的代理对象public Object getProxyInstance() {//1.创建一个工具类Enhancer enhancer new Enhancer();//2.设置父类enhancer.setSuperclass(target.getClass());//3.设置回调函数enhancer.setCallback(this);//4.创建子类对象return enhancer.create();}/*** 当使用代理对象调用目标对象的函数时就会跳到这个函数跟之前动态代理时类似* param o* param method 代理对象调用的目标对象的函数* param args 函数的参数* param methodProxy* return* throws Throwable*/Overridepublic Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {System.out.println(cglib代理模式开始);// 调用目标对象的函数System.out.println(method method);System.out.println(args args);Object returnVal method.invoke(target, args);System.out.println(cglib代理结束);return returnVal;}
}4.Client.java
package com.sun.cglib;/*** Description:* Author sun* Create 2024/6/8 19:50* Version 1.0*/
public class Client {public static void main(String[] args) {// 创建一个目标对象TeacherDao teacherDao new TeacherDao();// 得到目标对象的代理对象ProxyFactory proxyFactory new ProxyFactory(teacherDao);TeacherDao proxyInstance (TeacherDao) proxyFactory.getProxyInstance();// 使用代理对象来调用目标对象函数则会被代理proxyInstance.teach(小明);}
}5.结果 6.几种变体