Java 设计模式

Posted Luther-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 设计模式相关的知识,希望对你有一定的参考价值。

Java 常见的设计模式

  • Proxy 代理模式
  • Factory 工厂模式
  • Singleton 单例模式
  • Delegate 委派模式
  • Strategy 策略模式
  • Prototype 原型模式
  • Template 模板模式
  1. 代理模式是Java最常见的一种设计模式,客户端不是直接调用实际的对象,而是通过代理,来间接调用实际对象。代理模式可分为两种, 静态代理,动态代理

    静态代理:代码实现:

package spring.service;

public interface ProxyService 
	
	void say();


package spring.service.impl;

import spring.service.ProxyService;

public class RealProxy implements ProxyService

	private String name = "shanghai";
	@Override
	public void say() 
		System.out.println(name);
		
	


package spring.service.impl;

import spring.service.ProxyService;

public class Real2Proxy implements ProxyService

	private String name = "beijing";
	@Override
	public void say() 
		System.out.println(name);
		
	


package spring.service.impl;

import spring.service.ProxyService;

public class ProxyServiceImpl implements ProxyService

	private ProxyService service;
	
	public ProxyServiceImpl(ProxyService service)
		this.service = service;
	
	
	@Override
	public void say() 
		service.say();
		
	


package spring.controller;

import spring.service.ProxyService;
import spring.service.impl.ProxyServiceImpl;
import spring.service.impl.Real2Proxy;
import spring.service.impl.RealProxy;

public class ProxyController 
	
	public static void main(String[] args) 
		ProxyService service = new ProxyServiceImpl(new RealProxy());
		service.say();
		
		ProxyService service1 = new ProxyServiceImpl(new Real2Proxy());
		service1.say();
	


动态代理:也叫JDK代理,跟静态代理差不多,也有种叫cglib 代理

package spring.service.impl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * JDK 代理
 */
public class DynamicProxy implements InvocationHandler
	
	private Object object;
	
	public DynamicProxy(Object object)
		this.object = object;
	
	

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)throws Throwable 
		Object result = method.invoke(object, args);
        return result;
	


cglib 代理,要导入 cglib jar,还可以用springcglib 代理

package spring.service.impl;

/**
 * cglib 代理
 * 目前类不能用final 修饰
 * 方法不能用static final 修饰
 */
public class Cglib 
	
	private String name = "java";
	
	public void say()
		System.out.println(name);
	


package spring.service.impl;

import java.lang.reflect.Method;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;


public class CglibProxy implements MethodInterceptor
	
	private Object object;
	
	public CglibProxy(Object object)
		this.object = object;
	
	
	public Object getProxyInstance()
		//工具类
		Enhancer en = new Enhancer();
		//设置父类
		en.setSuperclass(object.getClass());
		//设置回调函数
		en.setCallback(this);
		//创建子类,(代理对象)
		return en.create();
	
	

	@Override
	public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable 
		Object result = method.invoke(object, args);
        return result;
	


package spring.controller;

import spring.service.impl.Cglib;
import spring.service.impl.CglibProxy;

public class ProxyController 
	
	public static void main(String[] args) 
		//静态
//		ProxyService service = new ProxyServiceImpl(new RealProxy());
//		service.say();
//		
//		ProxyService service1 = new ProxyServiceImpl(new Real2Proxy());
//		service1.say();
		
		//JDk代理
//		DynamicProxy proxy = new DynamicProxy(new RealProxy());
//		ProxyService service = (ProxyService) Proxy.newProxyInstance(proxy.getClass().getClassLoader(), new Class[]ProxyService.class, proxy);
//		service.say();
		
		//cglib 代理
		Cglib cg = (Cglib) new CglibProxy(new Cglib()).getProxyInstance();
		cg.say();
		
	


总结:三种代理模式各有优缺点和相应的适用范围,主要看目标对象是否实现了接口。以Spring框架所选择的代理模式举例

在Spring的AOP编程中:

如果加入容器的目标对象有实现接口,用JDK代理

如果目标对象没有实现接口,用Cglib代理

 

以上是关于Java 设计模式的主要内容,如果未能解决你的问题,请参考以下文章

java设计模式——装饰者模式

OO 设计原则是不是适用于 Python?

OO 设计原则是不是适用于 Python?

杨玲 201771010133《面向对象程序设计(java)》第三周学习总结

java常用的设计模式

Atitit.ati orm的设计and架构总结 适用于java c# php版