java 设计模式(待补充)

java的设计模式大体上分为三大类:
创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。
结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。
行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

单例模式:只生成一个实例

class Singleton{
	private static Singleton singleton = new Singleton();

	private Singleton(){}
	
	public static Singleton getInstance(){
		return singleton;
	}
}  

策略模式:
代理模式:静态代理,动态代理(通过reflex完成)
java 设计模式(待补充)
java 设计模式(待补充)
静态代理

//抽象角色->可以是抽象类也可以是接口
public abstract class Subject {
	public abstract void request();
}
//真实角色
public class RealSubject extends Subject {
	public void request() {
		System.out.println("RealSubject");
	}
}
//代理角色 
public class ProxySubject extends Subject {
private RealSubject  real;
	public void request() {
		if(null == real){
			real = new RealSubject ();
		}
		System.out.println("ProxySubject 1");
		real.request();
		System.out.println("ProxySubject 2");
	}
}

java 设计模式(待补充)
动态代理

抽象类
package proxyTest;

public interface Subject {
	public void request();
}

真实对象
package proxyTest;

public class RealSubject implements Subject {

	@Override
	public void request() {
		// TODO Auto-generated method stub
		System.out.println("RealSubject");
	}

}
代理对象

package proxyTest;

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

public class DynamicSubject implements InvocationHandler {

	private Object obj;
	
	public DynamicSubject(Object obj) {
		// TODO Auto-generated constructor stub
		this.obj=obj;
	}
	@Override
	public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
		// TODO Auto-generated method stub
		System.out.println("start");
		
		arg1.invoke(obj, arg2);
		
		System.out.println("end");
		return null;
	}

}
客户端运行
package proxyTest;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Client {
	public static void main(String[] args) {
		RealSubject real = new RealSubject();
		 
		InvocationHandler handler = new DynamicSubject(real);
		
		Class<?> classType = handler.getClass();
		Class<?> classType2 = real.getClass();
		
		Subject subject = (Subject)Proxy.newProxyInstance(classType.getClassLoader(), classType2.getInterfaces(), handler);
		subject.request();
	}
}