设计模式

一、单例模式Singleton

特点:

  1、单例类只能有一个实例

  2、单例类自己创建自己的唯一实例

  3、单例类必须给整个系统提供这个实例

饿汉式:

public class Singleton {
    private static final Singleton singleton=new Singleton();
    private Singleton(){
    }
    public static Singleton getSingleton(){
        return singleton;
    }
}

  优点:写法简单,在类装载的时候就完成了实例化,避免了线程同步问题

  缺点:没有延迟加载在类装载的时候就完成了实例化,如果没有使用过实例,就会造成内存浪费

懒汉式:线程不安全

  1、构造函数私有化

  2、类中初始化一个私有的静态常对象

  3、通过get方法获取该实例

public class Singleton {
    private static final Singleton singleton=null;
    private Singleton(){
    }
    public static Singleton getSingleton(){
        if(singleton==null){
            singleton=new Singleton();
        }
        return singleton;
    }
}

 

二、原型模式prototype:通过拷贝指定的原型实例,创建和该对象一样的新对象

深拷贝:不仅复制成员变量中 基本数据类型的值,还会给引用数据类型的成员变量申请存储空间,这样拷贝出来的新对象不会对原来造成影响

浅拷贝:1、当成员变量是基本数据类型时,复制值  2、当成员变量是引用数据类型,复制引用数据类型的地址值

【注】

  1、Object类中提供的clone都是浅拷贝,可以把String当作基本类

  2、使用clone方法,类的成员变量不能增加final关键字

实现Cloneable接口,当作原型

public class PrototypeClass implements Cloneable{
    @Override
    protected PrototypeClass clone() throws CloneNotSupportedException {
        PrototypeClass prototypeClass=null;
        prototypeClass= (PrototypeClass) super.clone();
        return prototypeClass;
    }
}

中介者模式Mediator:用一个中介对象封装一系列对象交互,使各对象不需要显示的相互作用,从而使其耦合松散

抽象中介者:定义同事类,定义对象之间交互的业务方法

public abstract class Mediator {
    protected ConcretedColleague1 c1;
    protected ConcretedColleague2 c2;

    public ConcretedColleague1 getC1() {
        return c1;
    }

    public void setC1(ConcretedColleague1 c1) {
        this.c1 = c1;
    }

    public ConcretedColleague2 getC2() {
        return c2;
    }

    public void setC2(ConcretedColleague2 c2) {
        this.c2 = c2;
    }
//定义对象之间的交互
public abstract void doSomething1(); public abstract void doSomething2(); }

通用中介者:实现对象之间的交互

public class ConcreteMediator extends Mediator{
    @Override
    public void doSomething1() {
        super.c1.method1();
        super.c1.method2();
    }

    @Override
    public void doSomething2() {
        super.c2.method1();
        super.c2.method2();
    }
}

抽象同事类:每个同事都知道中介者

public abstract class Colleague {
    protected Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }
}

具体同事类:处理自己的业务逻辑 自己不能处理的交给中介者处理

public class ConcretedColleague1 extends Colleague{
    public ConcretedColleague1(Mediator mediator) {
        super(mediator);
    }

    public void method1() {
    }

    public void method2() {
    }
    public void deMethod1(){
        super.mediator.doSomething1();
    }
}

优点:减少了类间的依赖,只依赖中介者,同时降低了类间的耦合

缺点:中介者会很膨胀

、责任链模式Handler:使多个对象都有机会处理请求,将对象连成一条链,并沿着这条链传递请求

抽象处理者实现三个职责,请求处理方法handleMessage,设置下一个处理者,定义具体请求者实现的方法包括:定义自己处理的级别和具体的处理任务

 

public abstract class Handler {
    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    private Handler nextHandler;
    public final Response handleMessage(Request request){
        Response response=null;
        if(this.getHandlerLevel().equals(request.getRequestLevel())){
            response=echo(request);
        }
        else {
            if(this.nextHandler!=null){
                response=this.nextHandler.handleMessage(request);
            }
            else {
                //没有处理者
            }
        }
        return response;
    }
    protected abstract Level getHandlerLevel();
    protected abstract Response echo(Request request);

}

 

应用:HandlerExecutionChain

mappedHandler = getHandler(processedRequest);

每个Handler为HandlerExecutionChain 它为一个处理链,负责处理整个请求。HandlerExecutionChain主要负责请求的拦截器的执行和请求的处理,但是他本身不处理请求,只是将请求分配给在链上注册的处理器执行。HandlerExecutionChain维护了HandlerInterceptor(拦截器)的集合。

private final List<HandlerInterceptor> interceptorList = new ArrayList<>();

 

 

、代理模式Proxy:为其他对象提供一种代理 以控制对这个对象的访问

(1)静态代理:在程序运行前,代理类和被代理类的关系已经确定。(组合关系)

  公共接口

public interface Service {
    public void add();
    public void remove();
    public void update();
    public void insert();
}

 被代理类:具体实现

public class ServiceImpl implements Service{
    @Override
    public void add() {
        System.out.println("添加了一个对象");
    }

    @Override
    public void remove() {
        System.out.println("删除了一个对象");
    }

    @Override
    public void update() {
        System.out.println("更新了一个对象");
    }

    @Override
    public void insert() {
        System.out.println("查询了一个对象");
    }
}

 静态代理类(组合)

public class Proxy implements Service{
    private ServiceImpl service;

    public void setService(ServiceImpl service) {
        this.service = service;
    }

    @Override
    public void add() {
        log("增加");
        service.add();
    }

    @Override
    public void remove() {
        service.remove();
    }

    @Override
    public void update() {
        service.update();
    }

    @Override
    public void insert() {
        service.insert();
    }
    public void log(String msg){
        System.out.println("执行了"+msg+"操作");
    }
}

(2)动态代理

  1、JDK动态代理:基于接口

 生成动态代理类 ,通过invoke()方法来调用方法,通过Proxy.newProxyInstance来创建代理类对象

public class ProxyHandler implements InvocationHandler {
    private Service service;

    public void setService(Service service) {
        this.service = service;
    }
    //生成动态代理对象,利用反射,第一个参数是被代理类的类加载器,第二个参数是被代理类接口,第三个参数InvocationHandler的实现类
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), service.getClass().getInterfaces(),this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        log(method.getName());
        Object res=method.invoke(service,args);
        return res;
    }

    public void log(String msg){
        System.out.println("执行了"+msg+"方法");
    }
}

 

posted @ 2021-08-25 13:30  影的灰烬  阅读(23)  评论(0编辑  收藏  举报