Facade
门面模式:package com.jelly.mypattern.facade; /** * 警报器 * @author jelly * */ public class Alarm { public void activate(){ System.out.println("启动警报器"); } public void deactivate(){ System.out.println("关闭警报器"); } public void ring(){ System.out.println("拉响警报器,发出警报"); } public void stopRing(){ System.out.println("停止警报"); } }
package com.jelly.mypattern.facade; /** * 录像机 * @author jelly * */ public class Camera { public void trunON(){ System.out.println("打开录像机..."); } public void trunOFF(){ System.out.println("关闭录像机..."); } public void rotate(int degress){ System.out.println("录像机 旋转:"+degress+" 度"); } }
package com.jelly.mypattern.facade; /** * 灯泡 * @author jelly * */ public class Light { public void trunON(){ System.out.println("打开电灯..."); } public void trunOFF(){ System.out.println("关闭电灯 ..."); } public void changeBulb(){ System.out.println("换灯泡..."); } }
package com.jelly.mypattern.facade; /** * 感应器 * @author jelly * */ public class Sensor { public void activate(){ System.out.println("启动感应器..."); } public void deactivate(){ System.out.println("关闭感应器..."); } public void trigger(){ System.out.println("触发了感应器"); } }
package com.jelly.mypattern.facade; /** * 安保系统 门面类 * 假设一个保安需要管理以下设备: * 2个录像机 * 3个灯泡 * 1个感应器 * 1个警报器 * @author jelly * */ public class SecurityFacade { private Camera camera1 ,camera2; private Light light1,light2,light3; private Sensor sensor; private Alarm alarm; public SecurityFacade() { camera1=new Camera(); camera2=new Camera(); light1=new Light(); light2=new Light(); light3=new Light(); sensor=new Sensor(); alarm=new Alarm(); } /** * 保安员开始工作 监视周边环境 */ public void activate(){ camera1.trunON(); camera2.trunON(); light1.trunON(); light2.trunON(); light3.trunON(); sensor.activate(); alarm.activate(); } /** * 保安员结束工作 关闭所有设备 */ public void deactivate(){ camera1.trunOFF(); camera2.trunOFF(); light1.trunOFF(); light2.trunOFF(); light3.trunOFF(); sensor.deactivate(); alarm.deactivate(); } }
package com.jelly.mypattern.facade; public class FacadeTest { /** * Facade * 门面模式: * 1 门面(外观)模式属于对象型结构模式,使外部系统与内部子系统的交互通过统一的门面对象进行,这就是门面模式 * 2 门面模式提供一个高层次的接口,使得子系统对外部更容易被使用 * 3 例子 安保系统 * @param args */ public static void main(String[] args) { SecurityFacade securityFacade=new SecurityFacade(); System.out.println("保安员上班---"); securityFacade.activate(); System.out.println("保安员下班---"); securityFacade.deactivate(); } }
package com.jelly.mypattern.proxy; /** * 抽象主题角色 * 声明了代理主题和真实主题的共同接口 * @author jelly * */ public abstract class Subject { /** * 发出请求方法 */ public abstract void request(); }
真实主题角色
package com.jelly.mypattern.proxy; /** * 真实主题角色: * 继承抽象主题 * @author jelly * */ public class RealSubject extends Subject { public RealSubject() { super(); } @Override public void request() { System.out.println("发送请求 request"); } }
package com.jelly.mypattern.proxy; /** * 代理主题角色: * 含有真实主题角色的引用,从而可以在任何时候操作真实主题, * 代理主题角色提供与真实主题相同的接口,以便在任何时候都可以代替真实主题, * 控制对真实主题的调用 * @author jelly * */ public class ProxySubject extends Subject{ private RealSubject realSubject ; @Override public void request() { if(realSubject==null){ realSubject=new RealSubject(); } preRequest(); realSubject.request(); postRequest(); } /** * 执行request之前的一些操作 */ public void preRequest(){ System.out.println("do preRequest..."); } /** * 执行request之后的一些操作 */ public void postRequest(){ System.out.println("do postRequest..."); } }
package com.jelly.mypattern.proxy; /** * 客户端测试类 * @author jelly * */ public class ProxyTest { /** * Proxy * 代理模式: * 1 代理主题并不改变主题接口,因为代理的意图是不让客户端感觉到代理的存在。 * 2 代理主题使用对象委派,将客户端的请求委派到真实的主题对象。 * 3 代理主题在传递请求的之前、之后都可以执行一些特定的操作,而不是单纯地传递请求 * @param args */ public static void main(String[] args) { Subject subject=new ProxySubject(); subject.request(); } }
package com.jelly.mypattern.proxy; public interface IStudentService { public void save(Student student); public Student findById(int id); public void update(Student student); }
package com.jelly.mypattern.proxy; public class StudentService implements IStudentService{ @Override public void save(Student student) { System.out.println("保存 Student 对象成功"); } @Override public Student findById(int id) { Student student=new Student(); student.setId(id); student.setName("张晓华"); student.setGrade("小学3年级"); student.setChinese(80); student.setMath(80); student.setEnglish(80); return student; } @Override public void update(Student student) { System.out.println("更新 Student 对象成功"); } }
package com.jelly.mypattern.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 统计业务方法执行耗时的 handler * @author jelly * */ public class LogBusinessTimeHandler implements InvocationHandler { private Object target ; LogBusinessTimeHandler(Object target){ this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("=====开始执行目标业务方法:"+method.getName()+"======"); long startTime=System.currentTimeMillis(); Object result = method.invoke(target, args); long endTime=System.currentTimeMillis(); System.out.println("=====执行业务方法完成,耗时: "+(endTime-startTime)+" 毫秒======"); return result; } }
package com.jelly.mypattern.proxy; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Proxy; public class ProxyTest2 { public static void main(String[] args) { IStudentService studentService=new StudentService(); LogBusinessTimeHandler handler=new LogBusinessTimeHandler(studentService); IStudentService studentServiceProxy= (IStudentService) Proxy.newProxyInstance(studentService.getClass().getClassLoader(), studentService.getClass().getInterfaces(), handler); Student stu= studentServiceProxy.findById(11); System.out.println(stu); stu.setName("张晓明"); studentServiceProxy.update(stu); stu.setName("张小可"); studentServiceProxy.save(stu); System.out.println(studentServiceProxy.getClass().getName());//类名 com.sun.proxy.$Proxy0 System.out.println(studentServiceProxy.getClass().getSimpleName());//类的简单名称 $Proxy0 printClassDefinition(studentServiceProxy.getClass()); } @SuppressWarnings("rawtypes") public static void printClassDefinition(Class clz){ String clzModifier = getModifier(clz.getModifiers()); if(clzModifier!=null && !clzModifier.equals("")){ clzModifier = clzModifier + " "; } String superClz = clz.getSuperclass().getName(); if(superClz!=null && !superClz.equals("")){ superClz = "extends " + superClz; } Class[] interfaces = clz.getInterfaces(); String inters = ""; for(int i=0; i<interfaces.length; i++){ if(i==0){ inters += "implements "; } inters += interfaces[i].getName(); } System.out.println(clzModifier +clz.getName()+" " + superClz +" " + inters ); System.out.println("{"); Field[] fields = clz.getDeclaredFields(); for(int i=0; i<fields.length; i++){ String modifier = getModifier(fields[i].getModifiers()); if(modifier!=null && !modifier.equals("")){ modifier = modifier + " "; } String fieldName = fields[i].getName(); String fieldType = fields[i].getType().getName(); System.out.println(" "+modifier + fieldType + " "+ fieldName + ";"); } System.out.println(); Method[] methods = clz.getDeclaredMethods(); for(int i=0; i<methods.length; i++){ Method method = methods[i]; String modifier = getModifier(method.getModifiers()); if(modifier!=null && !modifier.equals("")){ modifier = modifier + " "; } String methodName = method.getName(); Class returnClz = method.getReturnType(); String retrunType = returnClz.getName(); Class[] clzs = method.getParameterTypes(); String paraList = "("; for(int j=0; j<clzs.length; j++){ paraList += clzs[j].getName(); if(j != clzs.length -1 ){ paraList += ", "; } } paraList += ")"; clzs = method.getExceptionTypes(); String exceptions = ""; for(int j=0; j<clzs.length; j++){ if(j==0){ exceptions += "throws "; } exceptions += clzs[j].getName(); if(j != clzs.length -1 ){ exceptions += ", "; } } exceptions += ";"; String methodPrototype = modifier +retrunType+" "+methodName+paraList+exceptions; System.out.println(" "+methodPrototype ); } System.out.println("}"); } public static String getModifier(int modifier){ String result = ""; switch(modifier){ case Modifier.PRIVATE: result = "private"; case Modifier.PUBLIC: result = "public"; case Modifier.PROTECTED: result = "protected"; case Modifier.ABSTRACT : result = "abstract"; case Modifier.FINAL : result = "final"; case Modifier.NATIVE : result = "native"; case Modifier.STATIC : result = "static"; case Modifier.SYNCHRONIZED : result = "synchronized"; case Modifier.STRICT : result = "strict"; case Modifier.TRANSIENT : result = "transient"; case Modifier.VOLATILE : result = "volatile"; case Modifier.INTERFACE : result = "interface"; } return result; } }
package com.jelly.mypattern.proxy; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class MyCGLIBProxy implements MethodInterceptor{ private Object target; //目标对象 /** * 创建代理对象 * * @param target * @return */ public Object getInstance(Object target) { this.target = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass()); // 回调方法 enhancer.setCallback(this); // 创建代理对象 return enhancer.create(); } @Override // 回调方法 public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("before..."); Object result = proxy.invokeSuper(obj, args); System.out.println("after..."); return result ; } }
package com.jelly.mypattern.proxy; public class ProxyTest3 { public static void main(String[] args) { MyCGLIBProxy cglibProxy=new MyCGLIBProxy(); StudentService studentService = (StudentService)cglibProxy.getInstance(new StudentService()); Student stu=new Student(); studentService.save(stu); } }
package com.jelly.mypattern.bridge; /** * 抽象化角色 * @author jelly * */ public abstract class Abstracation { protected Implementor imp; public void setImp(Implementor imp){ this.imp=imp; } public void operation(){ imp.operationImp(); } }
package com.jelly.mypattern.bridge; /** * 修正 抽象化角色 * @author jelly * */ public class RefindAbstracation extends Abstracation { @Override public void operation() { this.imp.operationImp(); System.out.println("扩展、修正抽象化功能。。。"); } }
package com.jelly.mypattern.bridge; /** * 实现化角色 * @author jelly * */ public abstract class Implementor { public abstract void operationImp() ; }
package com.jelly.mypattern.bridge; /** * 具体实现化类A * @author jelly * */ public class ConcreteImplementorA extends Implementor{ @Override public void operationImp() { System.out.println("ConcreteImplementorA 的一些操作 "); } }
package com.jelly.mypattern.bridge; /** * 具体实现化类 B * @author jelly * */ public class ConcreteImplementorB extends Implementor{ @Override public void operationImp() { System.out.println("ConcreteImplementorB 的一些操作 "); } }
package com.jelly.mypattern.bridge; /** * 桥梁模式 测试代码 * @author jelly * */ public class BridgeTest { public static void main(String[] args) { Abstracation abstration=new RefindAbstracation(); Implementor imp=new ConcreteImplementorA(); abstration.setImp(imp); // Implementor imp2=new ConcreteImplementorB(); // abstration.setImp(imp2); abstration.operation(); } }
上一篇:java设计模式(三)
下一篇:java设计模式(五)
Copyright © 叮叮声的奶酪 版权所有
备案号:鄂ICP备17018671号-1