设计模式

2018-12-06  本文已影响11人  健倾心语

设计模式的主要作用:
重复利用
代码易于扩展
提高阅读
减少代码

设计模式23种
分为三大类
创建型:
工厂
单例
结构型:
代理,适配器
行为型:
策略模式

设计模式的六大原则:
1.开闭原则:扩展性,易于修改
2.里氏代换原则:面向对象
3.依赖倒转原则:面向接口编程
4.接口隔离原则:接口分离
5.迪米特法则:定义类尽量和其他类发生关系
6.合成复用原则:代码复用等

什么是单例设计模式:保证jvm中只能有一个实例
一种是懒汉式:
一种是饿汉式:
区别:懒汉式:线程不安全,是需要的时候才会创建
饿汉式:天生不安全的,jvm加载的时候就初始化了

简单的一个单例单例饿汉模式例子

package com.crj.designmode;

//懒汉式:当需要的时候才去创建
 class Singleton{
    private static Singleton singleton ;
    private Singleton() {}//构造方法私有
    public static Singleton getSingleton() {
        if(singleton == null) {
            synchronized (Singleton.class) {//不能用this.class,因为是静态方法,当singleton不为空的时候,才加第一层锁
                if (singleton == null) {//在判断,算是第二次加锁
                    singleton = new Singleton();
                }
            }
        }
        return singleton;//不为空,就不会发生线程安全问题,就不用加锁,这样提高程序的效率
    }
}

/**   
 * @author: crj
 * @date: 2018年12月6日 下午5:37:30 
 */
public class Lanhanshi {
    public static void main(String[] args) {
        Singleton s1 = Singleton.getSingleton();
        Singleton s2 = Singleton.getSingleton();
        System.out.println(s1 == s2);
    }
    

}


饿汉式:

//饿汉式
 class Singleton2{
        private static Singleton2 singleton = new Singleton2();//不管需不需要,加载的时候就已经创建,static修饰不可改变,所以天生安全
        private Singleton2() {}//构造方法私有
        public static Singleton2 getSingleton() {
            return singleton;//不为空,就不会发生线程安全问题,就不用加锁,这样提高程序的效率
        }
    }

工厂模式:

package com.crj.designmode;

/** 
 * 工厂模式  
 * @author: crj
 * @date: 2018年12月6日 下午6:31:53 
 */

interface Car{
    public void run ();
}

class Aodi implements Car{
    @Override
    public void run() {
        System.out.println("我是奥迪");
        
    }
    
}

class Benchi implements Car{
    @Override
    public void run() {
        System.out.println("我是奔驰");
        
    }
    
}

class CarFactory{
    public static Car createCar(String carName) {
        Car car = null;
        switch (carName) {
        case "奥迪":
            car = new Aodi();
            break;
        case "奔驰":
            car = new Benchi();
            break;

        default:
            break;
        }
        return car;
        
    }
}

public class FactoryMode {
    public static void main(String[] args) {
        Car car = CarFactory.createCar("奔驰");
        car.run();
    }

}

代理设计模式:面向切面方程,面向AOP编程

优点:保证真实角色
远程代理RMI
延迟加载
aop,日志打印,事务,权限控制

代理分类:
静态代理:需要生成代理,
动态代理:不需要生成代理
jdk动态代理
CGLIB动态代理

静态代理和动态代理和CGLIB动态代理:

package com.crj.designmode;

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

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**   
 * 静态代理模式:每次都要生成一个代理
 * 动态代理模式:不需要生成代理
 * 这里是一个通过中介去买房的例子说明
 * @author: crj
 * @date: 2018年12月7日 上午9:40:28 
 */

interface House{
    void buyHouse();
}

class Buyer implements House {
    @Override
    public void buyHouse() {
        System.out.println("我是买房人,我终于可以买房了");
    }
    
}
//静态代理
class Proxy implements House{
    //代理对象
    private Buyer buyer;
    Proxy(Buyer buyer){
        this.buyer = buyer;
    }
    @Override
    public void buyHouse() {
        System.out.println("我是中介,正在帮你处理买房的业务");
        buyer.buyHouse();
        System.out.println("我是中介,已经完成帮你买房的业务了");
    }
}


//动态代理
class JdkAutoProxy implements InvocationHandler{
    private Object target;
    JdkAutoProxy(Object target){
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("我是中介,正在帮你处理买房的业务");
        Object invoke = method.invoke(target, args);
        System.out.println("我是中介,已经完成帮你买房的业务了");
        return invoke;
    }
    
}

//cglib动态代理
class Cglib implements MethodInterceptor{

    @Override
    public Object intercept(Object oj, Method method, Object[] arrays, MethodProxy methodProxy) throws Throwable {
        System.out.println("我是中介,正在帮你处理买房的业务");
         Object invokeSuper = methodProxy.invokeSuper(oj, arrays);
        System.out.println("我是中介,已经完成帮你买房的业务了");
        return invokeSuper;
    }
    
}


public class StaticProxy {
    public static void main(String[] args) {
//      House house = new Proxy(new Buyer());
//      house.buyHouse();
        Buyer buyer = new Buyer();
        //动态代理
        /*JdkAutoProxy jdkAutoProxy = new JdkAutoProxy(buyer);
        House house = (House) java.lang.reflect.Proxy.newProxyInstance(buyer.getClass().getClassLoader(), buyer.getClass().getInterfaces(), jdkAutoProxy);
        house.buyHouse();*/
        //Cglib动态代理
        Cglib cglib = new Cglib();
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(Buyer.class);
        enhancer.setCallback(cglib);
        House house = (House) enhancer.create();
        house.buyHouse();
    }

}

上一篇下一篇

猜你喜欢

热点阅读