代理模式
两个子类共同实现一个接口,其中一个子类负责真实业务实现,另一个子类完成辅助真实业务主题的操作。这就像极了我们的代购操作。虽然真正买东西付钱的是我,可是我是通过代购的人代替我去实体店买的。
代理模式组成:
1.接口 --定义操作
2.真实主题类–
3.代理类。
举个例子:买口红
package www.Factory;
//接口定义具体操作-这里是买口红
interface IBuyRouge{
void buyRouge();
}
//真实的主题类,就是我真实给钱的
class RealBuyRouge implements IBuyRouge{
public void buyRouge(){
System.out.println("buy YSL");
}
}
//代理类,替我去买的
class ProxyBuyRouge implements IBuyRouge{
private IBuyRouge realBuyRouge;
ProxyBuyRouge(IBuyRouge realBuyRouge){
this.realBuyRouge =realBuyRouge;
}
public void buyRouge() {
this.realBuyRouge.buyRouge();
}
}
public class Subject{
public static void main(String[] args) {
IBuyRouge buyRouge = new ProxyBuyRouge(new RealBuyRouge());
buyRouge.buyRouge();
}
}
用反射模型改写代理模型:
import java.lang.reflect.Constructor;
interface ISubject{
void buy();
}
class RealSubject implements ISubject{
@Override
public void buy() {
System.out.println("买糖吃");
}
}
class ProxySubject implements ISubject{
private ISubject subject;
public ProxySubject(ISubject subject){
this.subject = subject;
}
public void beforeBuy(){
System.out.println("排队");
}
public void afterBuy(){
System.out.println("发快递");
}
public void buy(){
this.beforeBuy();
this.subject.buy();
this.afterBuy();
}
}
class Factory {
private Factory() {
}
public static <T> T getInstrance(String proxyClassName,
String realClassName){
T t = null;
T realObj = getInstrance(realClassName);
try {
Constructor<?> cons = Class.forName(
proxyClassName).getConstructor(
realObj.getClass().getInterfaces()[0]);
t = (T)cons.newInstance(realObj);
} catch (Exception e) {
e.printStackTrace();
}
return t;
}
private static <T> T getInstrance(String className) {
T t = null;
try {
t = (T)Class.forName(className).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return t;
}
}
public class Test{
public static void main(String[] args){
ISubject subject = Factory.getInstrance("quanlujing.ProxySubject",
"quanlujing.RealSubject");//类的全路径名称
subject.buy();
}
}
用动态代理模型:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface ISubject{
void buy();
}
class RealSubject implements ISubject{
@Override
public void buy() {
System.out.println("买糖吃");
}
}
class ProxySubject implements InvocationHandler{
private Object subject;
public void beforeBuy(){
System.out.println("排队");
}
public void afterBuy(){
System.out.println("发快递");
}
public Object bind(Object obj){
this.subject = obj;
return Proxy.newProxyInstance(subject.getClass().getClassLoader(),
subject.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
this.beforeBuy();
Object ret = method.invoke(this.subject,args);
this.afterBuy();
return ret;
}
}
public class Test{
public static void main(String[] args){
ISubject subject =(ISubject) new ProxySubject().
bind(new RealSubject());
subject.buy();
}
}
单利模式
单利模式要求一个类仅允许产生一个实例化对象。
具体要求:
1.构造方法私有,类的外部无法实例化
2.类内部实例化对象,类外部通过类内的静态get方法获取该实例化出的对象。
饿汉式单利模式 --上来就new
class Singletion{
private staitc final Singletion singletion = new Singletion();
private Singletion(){};//构造私有
public static Singletion getSingletion(){
return singletion;
}
}
public class Test{
public static void main(String[] args){
Singletion singletion = getSingletion();
}
}
懒汉式单利模式–用时才new
class Singletion{
private staitc Singletion singletion ;
private Singletion(){};//构造私有
public static Singletion getSingletion(){
if(singletion == null){
singletion = new Singletion();
}
return singletion;
}
}
public class Test{
public static void main(String[] args){
Singletion singletion = getSingletion();
}
}