java 设计模式(待补充)
java的设计模式大体上分为三大类:
创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。
结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。
行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
单例模式:只生成一个实例
class Singleton{
private static Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}
策略模式:
代理模式:静态代理,动态代理(通过reflex完成)
静态代理
//抽象角色->可以是抽象类也可以是接口
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");
}
}
动态代理
抽象类
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();
}
}